扩展NSError是一个好习惯

时间:2014-10-27 13:31:10

标签: ios objective-c nserror

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

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

4 个答案:

答案 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已经非常多才多艺。它允许通过设置domaincode属性来定义错误类型,并允许在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