2014-10-27 97 views
7

對不起,提出這個問題。我知道在java中我們正在擴展異常類的自定義異常。但是我在目標c中看不到任何場景。擴展NSError是否是一個好習慣

所以我的問題是擴展NSError並引入自定義錯誤是一個好習慣嗎?如果是這樣的話,我們應該擴展NSError類。我也檢查過這個文件。但是我看不到NSError的重要提示。

+5

我沒有看到需要,因爲NSError提供了一個域屬性,您可以將其設置爲任何域特定的值。你想用「NSError」子類添加什麼值? – trojanfoe 2014-10-27 13:36:36

+1

我也這麼想。但讓我們說一些場景,例如暴露一些關於錯誤的更多信息。可能是一些特定領域的細節。 – uiroshan 2014-10-27 13:38:44

+4

再次,通過向'userInfo'字典中添加條目已被'NSError'覆蓋。 – trojanfoe 2014-10-27 13:39:41

回答

6

我從來沒有見過這樣做,這是因爲NSError已經非常多才多藝。它允許通過設置domaincode屬性來定義錯誤類型,並允許在userInfo字典中附加任意附加信息。

所以,不,這不是好習慣。

+0

欲瞭解更多信息,請查看NSHipster的[NSError文章](http://nshipster.com/nserror/)。到目前爲止,我見過的唯一一個地方有一個巨大的可能的NSErrors列表。 – 2015-09-04 13:32:21

+1

由於它是在Apple文檔中編寫的,因此可以繼承子類。 – Ramis 2015-09-22 10:43:21

13

儘管我同意你不應該子類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更簡單地說,建設用戶信息的方式我想,和拉數據背出用戶信息的不來電需要了解其內部表示。我認爲這是一種非常好的數據隱藏形式,並鼓勵使用更多的描述性信息。

同樣,即使是較小的項目,我也經常創建一個+myErrorWithCode:localizedDescription:類別方法。我知道我的域名,所以我通常不需要通過該域名,這使得在用戶信息中設置NSLocalizedDescription密鑰變得更容易。同樣,這樣可以更容易地創建更好的錯誤,並且可以更輕鬆地更改錯誤處理的實現細節。

0

擴展NSError並不是一個壞主意。 我也爲NSError做了一個類別供我自己使用。我想與你分享。

(1)做一個strings文件來定義所有的錯誤代碼:

/* 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"; 

(2)請在NSError一個類別,因此我們說 「NSError + ERRORINFO」:

@interface NSError (ErrorInfo) 

-(NSString *)userDescription; 

@end 

(3)定義它:

#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 

(4)利用它:

NSError *yourError; // This can be any NSError object you get 
yourError = [NSError errorWithDomain:@"yourDomain" code:2000 userInfo:details]; // Just for test 
NSLog(@"%@",[yourError userDescription]); 
3

在文檔編寫,這是確定的子類:

應用程序可以選擇創建NSError的子類,例如, 通過重寫 localizedDescription來提供更好的本地化錯誤字符串。

在我來說,我與OSStatus這是的Int32工作。 NSError構造器僅支持Int。所以我需要將它繼承以支持OSSStatus

相關問題