扩展NSError是一个好习惯

uir*_*han 8 objective-c nserror ios

很抱歉提出这个问题.我知道在java中我们正在为自定义异常扩展Exception类.但我没有在目标c中看到任何情况.

所以我的问题,扩展NSError和引入自定义错误是一个好习惯吗?如果是这样,我们应该扩展NSError类.我也检查过这方面的文档.但我看不到NSError的覆盖注释.

Rob*_*ier 15

虽然我同意你不应该继承子类NSError,但是在它上面添加类别非常有用,而且我会定期这样做.例如,假设您的系统经常发布来自某个JSON块的错误.我发现创建一个类别非常方便:

@interface NSError (MyErrors)
// Construct an NSError from data in JSON.
// Include full JSON response in the userInfo
+ (NSError *)myErrorWithJSON:(JSON *)json;

// Parse the text out of the user info
- (NSString *)myErrorMessage;

// The full JSON error block as a string
- (NSString *)myErrorJSON;

// BOOLs can be helpful sometimes, or you could return an enum for use in a switch.
- (BOOL)myIsNetworkError;
- (BOOL)myIsAuthError;
@end
Run Code Online (Sandbox Code Playgroud)

我经常编写小帮助程序来构造NSError更简单,按照我想要的方式构造userinfo,并将pull数据从userinfo中取回,而不需要调用者知道其内部表示.我发现这是一种非常好的数据隐藏形式,并鼓励使用更具描述性的消息.

同样,即使对于较小的项目,我也经常创建一个+myErrorWithCode:localizedDescription:类别方法.我知道我的域名,所以我通常不需要通过它,这使得NSLocalizedDescription在用户信息中设置密钥变得更加容易.同样,这通过使它们更容易创建来鼓励更好的错误,并且更容易更改错误处理的实现细节.


tro*_*foe 8

我从来没有见过它,因为NSError它已经非常多才多艺.它允许通过设置domaincode属性来定义错误类型,并允许在userInfo字典中附加任意附加信息.

所以,不,这不是好习惯.

  • 可以在子文档中编写,因为它是在Apple文档中编写的. (3认同)

Ram*_*mis 5

在文档中写道,可以继承子类:

应用程序可以选择创建NSError的子类,例如,通过覆盖localizedDescription来提供更好的本地化错误字符串。

就我而言,我正在使用OSStatus,它是Int32。NSError构造函数仅支持Int。因此,我需要对其进行子类化以支持OSSStatus