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

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

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

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



답변

저는 개인적으로 역 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


답변

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


답변

사용자 지정 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에 할당하고 완료하십시오.


답변