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


114

之前有一篇SO帖子,关于为您自己的框架设置错误域,但是关于为您自己的项目/应用设置错误域和自定义错误代码的最佳实践是什么?

例如,假设您正在使用具有大量验证的Core Data密集型应用程序,那么您应该坚持使用“现成的” Core Data错误代码(例如NSManagedObjectValidationErrorfrom CoreDataErrors.h),还是应该创建自己的错误代码MyAppErrors.h并使用更具特异性(即MyAppValidationErrorInvalidCombinationOfLimbs

创建一个自定义错误域和一组错误代码可能会极大地使您的代码歧义化,但是维护起来是否过多的开销,是否需要担心错误代码编号冲突?还是这里还有其他问题?

Answers:


152

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

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

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

这是确保我不会与任何其他人的错误域发生冲突的简单方法(如果我使用的是第三方代码),除非开发人员有意试图与我打交道(我相信这种情况不太可能发生)。 ..)。

至于代码编号冲突,不必担心。只要代码在域中是唯一,就可以了。

至于翻译错误,这取决于您。无论您做什么,都要确保记录正确。 个人而言,我通常只是将框架生成的错误传递给我,因为我永远不确定我会处理所有代码并将所有userInfo转换为我的项目所特有的内容。这些框架可以更改和添加更多代码,或更改现有代码的含义等。这也有助于我更具体地确定错误的出处。例如,如果我的StackKit框架在com.stackkit域中生成错误,那么我知道这是框架问题。但是,如果它在中生成错误NSURLErrorDomain,那么我知道它特别来自URL加载机制。

可以执行的操作是捕获框架生成的错误,并将其包装在具有您的域和通用代码(如kFrameworkErrorCodeUnknown或之类)的新错误对象中,然后将捕获的错误放在userInfoNSUnderlyingErrorKey。CoreData会做很多事情(例如,如果您尝试save:使用NSManagedObjectContext,但是遇到关系完整性错误,则会返回一个错误,但是NSUnderlyingErrorKey它将包含更多信息,例如明确指出哪些关系是错误的,等等)。


由于苹果还使用反向DNS,因此其他人也应该使用这种样式。
约翰·卡尔森

36

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


4
好主意。如果您使用的是Swift,则应使用unwrapped可选:(NSBundle.mainBundle().bundleIdentifier!如果您知道设置了捆绑包标识符,我猜很可能是这样)
2015年

您为什么要在错误域中反映项目名称的更改?
zrslv 2015年

1
@zrxq可以肯定的是,具有不同的错误域是有价值的,但是想象一下,您拼错了项目,或者您更改了名称,希望将其反映在所有地方。动态设置比硬编码更好。
康纳

1
@vare显然,我真的不明白这将带来什么实际好处。我的理解是,这些标识符在应用程序上下文中仅是唯一的,仅此而已。好吧,也许您只是希望他们在美学上更令人愉悦,我明白了!
zrslv 2015年

1
是的,您提出了一个要点。有时候,您希望域是唯一的,例如,如果您要创建一个SDK或(cocoa)Pod,则可能希望您的错误域反映出它的来源,而不是项目的名称。编辑:我也(在我的回答中)想指出@“ com.myName.myProject”在这种情况下与bundleIdentifier相同,人们可能不知道。
康纳2015年

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并完成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.