모범 사례-자신의 프로젝트 / 앱을위한 NSError 도메인 및 코드


114

거기에있다 이전 SO 게시물을 자신의 프레임 워크에 대한 오류 도메인을 설정에 대한,하지만 오류 도메인 및 사용자 지정 오류 코드를 설정에 관한 가장 좋은 방법은 무엇인가 자신의 프로젝트 / 앱은 ?

예를 들어 검증이 많은 Core Data 집약적 인 앱에서 작업하고 있다고 가정 할 때 "기성품"Core Data 오류 코드 (예 : NSManagedObjectValidationErrorfrom CoreDataErrors.h)를 고수 하거나 직접 생성 MyAppErrors.h하고 다음 을 사용하여 오류를 정의 해야합니다. 더 많은 특이성 (즉, MyAppValidationErrorInvalidCombinationOfLimbs?

사용자 지정 오류 도메인과 오류 코드 집합을 만들면 코드가 상당히 명확해질 수 있지만 유지 관리에 너무 많은 오버 헤드가 발생하고 오류 코드 번호 충돌에 대해 걱정해야합니까? 아니면 여기에 다른 문제가 있습니까?

답변:


152

저는 개인적으로 역 DNS 스타일 도메인을 사용합니다. 예를 들면 :

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];

도메인의 세 번째 부분 ( @"myproject")은이 프로젝트의 오류 ( "My Project")와 다른 프로젝트의 오류 ( "My Other Project"=> com.davedelong.myotherproject) 를 구별하는 데 사용됩니다 .

그것은 그 개발자가 의도적으로 혼란하려고하지 않는 한, (나는 제 3 자 코드를 사용하고있는 경우) 내가 누구 다른 사람의 오류 도메인과 충돌하지 않을거야 것을 확인하는 간단한 방법입니다 단지 내가보기 엔 어려울 것 믿는 (나. ..).

코드 번호 지정 충돌에 대해서는 걱정하지 마십시오. 코드가 도메인 내에서 고유 한 한 괜찮습니다.

오류를 번역하는 것은 당신에게 달려 있습니다. 무엇을하든 잘 문서화하십시오. 개인적 으로 나는 모든 코드를 처리하고 모든 userInfo를 내 프로젝트에 더 특정한 것으로 변환 할 것인지 확신 할 수 없기 때문에 일반적으로 프레임 워크 생성 오류가 발생했을 때 전달합니다. 프레임 워크는 더 많은 코드를 변경 및 추가하거나 기존 코드의 의미를 변경할 수 있습니다. 또한 오류가 발생한 위치를보다 구체적으로 식별하는 데 도움이됩니다. 예를 들어 내 StackKit 프레임 워크가 com.stackkit도메인 에서 오류를 생성하면 프레임 워크 문제라는 것을 알고 있습니다. 그러나에서 오류가 발생하면 NSURLErrorDomain특히 URL 로딩 메커니즘에서 비롯된 것입니다.

당신은 무엇을 할 수 할 것은 프레임 워크에서 생성되는 오류를 캡처하고 도메인 및 일반적인 코드, 같은 가진 새 오류 개체에 포장입니다 kFrameworkErrorCodeUnknown또는 무언가를 한 다음에 캡처 된 오류를 배치 userInfo세 이하 NSUnderlyingErrorKey. CoreData이 많이 (당신이하려고하면, 예를 들어, 수행 ,하지만 당신은 관계 무결성 오류를 가지고, 당신은 하나의 오류 등을 얻을 것이다, 그러나이 특별히 관계가 잘못되는 등의 더 많은 정보 등이 포함됩니다).save:NSManagedObjectContextNSUnderlyingErrorKey


apple은 역방향 DNS도 사용하기 때문에 다른 사람들도이 스타일을 사용하는 것이 적절 해 보입니다.
Johan Karlsson

36

댓글을 달 수있는 담당자가 충분하지 않지만 Dave DeLong이 수락 한 답변 [[NSBundle mainBundle] bundleIdentifier]의 경우 @"com.myName.myProject". 이렇게하면 이름이나 프로젝트의 이름을 변경하면 정확하게 반영됩니다.


4
좋은 생각. Swift를 사용하는 경우, 언 래핑 된 옵션을 사용해야합니다. NSBundle.mainBundle().bundleIdentifier!(번들 식별자가 설정되어 있다는 것을 알고 있다면 아마도 아마도 그럴 것입니다)
Juul

오류 도메인에 프로젝트 이름 변경 사항을 반영하려는 이유는 무엇입니까?
zrslv

1
@zrxq 확실히 다른 오류 도메인을 갖는 것이 가치가 있지만 프로젝트의 철자를 잘못 입력했거나 이름을 변경하여 모든 곳에 반영한다고 상상해보십시오. 하드 코딩 된 것보다 동적으로 설정하는 것이 좋습니다.
Connor

1
@vare 그 정도는 분명합니다. 그게 어떤 실질적인 이점을 제공하는지 정말 이해가 안갑니다. 내 이해는 이러한 식별자는 앱의 컨텍스트에서 고유해야한다는 것입니다. 좋아, 아마도 당신은 그들이 더 심미적으로 즐거워지기를 원할 수도 있습니다.
zrslv 2015

1
네, 좋은 지적을하셨습니다. 도메인이 고유하기를 원하는 경우가 있습니다. 예를 들어 SDK 또는 (cocoa) Pod를 만드는 경우 오류 도메인이 프로젝트가 아닌 출처를 반영하기를 원할 것입니다. 이름. 편집 : 나는 또한 (내 대답에서) @ "com.myName.myProject"가이 경우 사람들이 알지 못하는 bundleIdentifier와 동일하다는 것을 지적하고 싶었습니다.
Connor

4

사용자 지정 NSError를 만드는 방법 :

먼저 오류 메시지 사전을 만듭니다.

NSDictionary *userInfo = @{   
   NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil)
                                               };
NSError *error = [NSError errorWithDomain:[[NSBundle mainBundle] bundleIdentifier] 
  code:-58 userInfo:userInfo];

그런 다음 userInfo를 NSDictionary에 할당하고 완료하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.