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

以前有一篇关于为自己的框架设置错误域的SOpost ,但是为您自己的项目/应用程序设置错误域和自定义错误代码的最佳做法是什么?

例如,假设您正在开发一个具有大量validation的核心数据密集型应用程序,那么您应该坚持使用“现成的”核心数据错误代码(例如来自CoreDataErrors.h NSManagedObjectValidationError ),还是应该创build自己的MyAppErrors.h和更具体的定义错误(即MyAppValidationErrorInvalidCombinationOfLimbs

创build一个自定义的错误域和一组错误代码可能会明显地消除你的代码的歧义,但是维护的开销太多了,是否需要担心错误代码编号冲突? 或者这里还有其他的问题吗?

我个人使用反向DNS风格的域名。 例如:

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

域的第三部分( @"myproject" )仅用于区分来自此项目( "My Project" )的错误与另一个项目( "My Other Project" => com.davedelong.myotherproject )中的错误。

这是一个简单的方法,以确保我不会与其他人的错误域(如果我使用第三方代码)冲突,除非该开发人员有意地只是混淆我(我认为这是不太可能的。 ..)。

至于代码编号冲突,不要担心。 只要代码在一个域内是唯一 ,你应该没问题。

至于翻译错误,这取决于你。 不pipe你做什么,一定要logging下来。 个人而言 ,我通常只是传递框架生成的错误,因为我不太确定我会处理所有的代码,并将所有的userInfo转换为我的项目更具体的东西。 框架可以改变和添加更多的代码,或者改变现有代码的含义等等。这也帮助我更明确地识别错误来自哪里。 例如,如果我的StackKit框架在com.stackkit域中产生错误,我知道这是一个框架问题。 但是,如果它在NSURLErrorDomain产生错误,那么我知道它特别来自URL加载机制。

可以做的是捕获框架生成的错误,并将其包装在一个新的错误对象,它有你的域名和一个通用的代码,如kFrameworkErrorCodeUnknown或类似的东西,然后将捕获到的错误放在userInfo下的NSUnderlyingErrorKey 。 CoreData做了很多事情(例如,如果你试图save: NSManagedObjectContext ,但是你有关系完整性错误,你会得到一个单一的错误,但NSUnderlyingErrorKey将包含更多的信息,特别是哪些关系是错误的,等等)。

我没有足够的代表来评论,但对于Dave DeLong所接受的答案,使用[[NSBundle mainBundle] bundleIdentifier]而不是@"com.myName.myProject"可能会稍微好一些。 这样,如果你改变你的名字或项目的名字,它会被准确地反映出来。