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

有一个关于为您自己的框架设置错误域的 上一任督导主任职位,但是关于设置错误域和自定义错误代码 为您自己的项目/应用程序的最佳实践是什么?

例如,假设您正在开发一个核心数据密集型应用程序,并且有很多验证,那么您是应该坚持使用“现成的”核心数据错误代码(例如 CoreDataErrors.h中的 NSManagedObjectValidationError) ,还是应该创建自己的 MyAppErrors.h,并用更具体的方法定义错误(例如,MyAppValidationErrorInvalidCombinationOfLimbs

Creating a custom error domain and set of error codes could significantly disambiguate your code, but is it too much overhead to maintain and does one have to worry about error code numbering conflicts? Or are there other concerns here?

34558 次浏览

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

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

域的第三部分(@"myproject")只是用来区分这个项目的错误("My Project")和另一个项目的错误("My Other Project" = > com.davedelong.myotherproject)。

It's a simple way to ensure that I'm not going to conflict with anyone else's error domains (if I'm using 3rd party code), unless that developer is purposefully trying to mess with 只是 me (which I believe would be highly unlikely...).

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

至于翻译错误,那取决于你。不管你做什么,一定要好好记录下来。我通常只是把框架生成的错误传递给我,因为我从来没有十分确定我会处理所有的代码,并将所有的用户信息转换成我的项目更具体的东西。框架可以改变并添加更多的代码,或者改变现有代码的含义等等。它还可以帮助我更具体地确定错误来自何处。例如,如果我的 StackKit框架在 com.stackkit域中生成错误,我知道这是一个框架问题。但是,如果它在 NSURLErrorDomain中生成了一个错误,那么我知道它是来自 URL 加载机制。

可以所做的就是捕获框架生成的错误,并将其封装在一个新的错误对象中,该对象包含您的域和通用代码,比如 kFrameworkErrorCodeUnknown或其他代码,然后将捕获的错误放在 userInfo中的 NSUnderlyingErrorKey下面。CoreData 经常这样做(例如,如果您尝试 save:NSManagedObjectContext,但是您有关系完整性错误,您将得到一个错误,但是 NSUnderlyingErrorKey将包含更多的信息,比如具体哪些关系是错误的,等等)。

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

如何创建自定义 NSERerror:

首先创建错误消息的 Dictionary

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