最佳实践 - NSError域和您自己的项目/应用程序的代码

时间:2010-07-18 15:34:56

标签: objective-c cocoa core-data nserror

关于为您自己的框架设置错误域有previous SO post,但有关为您自己的项目/应用设置错误域和自定义错误代码的最佳做法是什么?

例如,假设您正在使用具有大量验证的Core Data密集型应用程序,您是否应该坚持使用“现成的”Core Data错误代码(例如NSManagedObjectValidationError来自{{1}或者你应该创建自己的CoreDataErrors.h并更具体地定义错误(即MyAppErrors.h

创建自定义错误域和错误代码集可能会明显消除代码歧义,但维护过多是否需要担心错误代码编号冲突?或者还有其他问题吗?

3 个答案:

答案 0 :(得分:147)

我个人使用反向DNS样式域。例如:

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

域的第三部分(@"myproject")仅用于区分此项目中的错误("My Project")与另一个项目中的错误("My Other Project" => {{1 }})。

这是一种确保我不会与其他人的错误域(如果我使用第三方代码)发生冲突的简单方法,除非该开发人员故意试图弄乱只是我(我相信这不太可能......)。

至于代码编号冲突,请不要担心。只要代码在域中是唯一的,您应该没问题。

至于翻译错误,这取决于你。无论你做什么,一定要把它记录好。 就个人而言,我通常只是传递框架生成的错误,因为他们来找我,因为我不确定我将处理所有代码并将所有userInfo转换为更具体的内容我的项目。框架可能会更改并添加更多代码,或更改现有代码的含义等。它还可以帮助我更具体地确定错误的来源。例如,如果我的StackKit框架在com.davedelong.myotherproject域中生成错误,我知道这是一个框架问题。但是,如果它在com.stackkit中生成错误,那么我知道它特别来自URL加载机制。

可以做的是捕获框架生成的错误并将其包装在一个新的错误对象中,该错误对象包含您的域和通用代码,例如NSURLErrorDomain或类似内容,然后放置kFrameworkErrorCodeUnknownuserInfo中捕获的错误。 CoreData做了很多事情(例如,如果你尝试NSUnderlyingErrorKey save:,但是你有关系完整性错误,你会收到一个错误,但NSManagedObjectContext将包含更多信息,特别是哪些关系是错误的等等。)

答案 1 :(得分:35)

我没有足够的代表发表评论,但对于Dave DeLong接受的答案,使用[[NSBundle mainBundle] bundleIdentifier]代替@"com.myName.myProject"可能会稍好一些。这样,如果您更改名称或项目的名称,它将被准确反映。

答案 2 :(得分: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并完成。