最佳实践 - 您自己的项目/应用程序的 NSError 域和代码
Posted
技术标签:
【中文标题】最佳实践 - 您自己的项目/应用程序的 NSError 域和代码【英文标题】:Best Practice - NSError domains and codes for your own project/app 【发布时间】:2010-07-18 15:34:56 【问题描述】:有一个previous SO post 是关于为您自己的框架设置错误域,但是关于为您自己的项目/应用程序设置错误域和自定义错误代码的最佳实践是什么? p>
例如,假设您正在开发一个需要大量验证的 Core Data 密集型应用程序,您是否应该坚持使用“现成的”Core Data 错误代码(例如来自 CoreDataErrors.h
的 NSManagedObjectValidationError
)或您是否应该创建自己的MyAppErrors.h
并更具体地定义错误(即MyAppValidationErrorInvalidCombinationOfLimbs
?
创建一个自定义错误域和一组错误代码可以显着消除您的代码歧义,但维护的开销是否太大,是否需要担心错误代码编号冲突?还是这里有其他顾虑?
【问题讨论】:
【参考方案1】:我个人使用反向 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
或其他东西,然后将捕获的NSUnderlyingErrorKey
下的 userInfo
出错。 CoreData 经常这样做(例如,如果您尝试 save:
和 NSManagedObjectContext
,但您有关系完整性错误,您将收到一个错误返回,但 NSUnderlyingErrorKey
将包含更多信息,例如哪些关系是错误的,等等)。
【讨论】:
由于苹果也使用反向 DNS,其他人也使用这种风格似乎是合适的。【参考方案2】:我没有足够的代表发表评论,但对于 Dave DeLong 接受的答案,使用 [[NSBundle mainBundle] bundleIdentifier]
而不是 @"com.myName.myProject"
可能会更好一些。这样,如果您更改名称或项目名称,它将准确反映。
【讨论】:
好主意。如果您使用的是 Swift,则应该使用未包装的可选选项:NSBundle.mainBundle().bundleIdentifier!
(如果您知道捆绑标识符已设置,我猜这很有可能)
为什么要在错误域中反映项目名称更改?
@zrxq 肯定有不同的错误域是有价值的,但想象一下你拼错了你的项目,或者你改变了你的名字,希望它在任何地方都能反映出来。动态设置比硬编码更好。
@vare 很清楚,我真的不明白这会带来什么实际好处。我的理解是这些标识符只需要在应用程序的上下文中是唯一的,仅此而已。好吧,也许你只是想让它们更美观,我明白了!
是的,你提出了一个很好的观点。有时您希望域是唯一的,我会假设......例如,如果您正在创建一个 SDK 或 (cocoa)Pod,您可能希望您的错误域反映它的来源,而不是项目的姓名。编辑:我还(在我的回答中)想指出 @"com.myName.myProject" 在这种情况下与 bundleIdentifier 相同,人们可能不知道。【参考方案3】:
如何创建自定义 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 并完成。
【讨论】:
以上是关于最佳实践 - 您自己的项目/应用程序的 NSError 域和代码的主要内容,如果未能解决你的问题,请参考以下文章