很抱歉提出这个问题。我知道在java中我们正在为自定义异常扩展Exception类。但是我没有在目标c中看到任何情况。
所以我的问题,扩展NSError和引入自定义错误是一个好习惯吗?如果是这样,我们应该扩展NSError类。我也检查过这方面的文档。但是我无法看到NSError的覆盖注释。
答案 0 :(得分: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
我经常编写小帮助器来构造NSError
更简单,按照我想要的方式构造userinfo,并将pull数据从userinfo中取回,而不需要调用者知道其内部表示。我发现这是一种非常好的数据隐藏形式,并鼓励使用更具描述性的信息。
同样,即使对于较小的项目,我也经常创建一个+myErrorWithCode:localizedDescription:
类别方法。我知道我的域名,所以我通常不需要通过它,这使得在用户信息中设置NSLocalizedDescription
密钥变得容易多了。同样,这可以通过使它们更容易创建来鼓励更好的错误,并且更容易更改错误处理的实现细节。
答案 1 :(得分:8)
我从来没有见过它,那是因为NSError
已经非常多才多艺。它允许通过设置domain
和code
属性来定义错误类型,并允许在userInfo
字典中附加任意附加信息。
所以,不,这不是好习惯。
答案 2 :(得分:4)
在文档中写道,可以继承子类:
应用程序可以选择创建NSError的子类,例如, 通过覆盖提供更好的本地化错误字符串 localizedDescription。
在我的情况下,我正在使用 OSStatus Int32 。 NSError构造函数仅支持 Int 。所以我需要将其子类化以支持 OSSStatus 。
答案 3 :(得分:0)
扩展NSError并不是一个坏主意。
我也在df1 <- structure(list(responses = c("A", "B", "C", "D"), freq = c(9L,
13L, 10L, 3L), percent = c(25.7, 37.1, 28.6, 8.6)),
.Names = c("responses", "freq", "percent"), class = "data.frame",
row.names = c(NA, -4L))
上为我自己使用了一个类别。我想和你分享。
(1)制作一个NSError
文件来定义所有错误代码:
strings
(2)在NSError上创建一个类别,假设&#34; NSError + ErrorInfo&#34;:
/* Following are general error messgaes those we can show to user
regarding to Internet connection and request. You can add more
codes. */
"-1001" = "Connection time out";
"-1003" = "Cannot find Host";
"-1004" = "Cannot connect to Host";
"-1005" = "Server is temporarily down";
"-1009" = "The Internet connection appears to be offline";
"-1012" = "Authentication failed";
"2000" = "This is a custom error message"; // custom created error code
/* Always describe unknow error with whatever you want in
except case (i.e. except error codes). If not mentioned
the following line, still you will get message "Unknown error" */
"Unknown error" = "Network error occured";
(3)定义:
@interface NSError (ErrorInfo)
-(NSString *)userDescription;
@end
(4)使用它:
#define ERROR_KEY(code) [NSString stringWithFormat:@"%d",code]
#define ERROR_LOCALIZED_DESCRIPTION(code) NSLocalizedStringFromTable(ERROR_KEY(code),@"Errors",nil)
@implementation NSError (ErrorInfo)
-(NSString *)userDescription
{
NSString *errorDescrption = NSLocalizedStringFromTable(ERROR_KEY(self.code),@"Errors",nil);
if (!errorDescrption || [errorDescrption isEqual:ERROR_KEY(self.code)]){
return NSLocalizedStringFromTable(@"Unknown error",@"Errors",nil);;
}
else{
return ERROR_LOCALIZED_DESCRIPTION(self.code);
}
return nil;
}
@end