對不起,提出這個問題。我知道在java中我們正在擴展異常類的自定義異常。但是我在目標c中看不到任何場景。擴展NSError是否是一個好習慣
所以我的問題是擴展NSError並引入自定義錯誤是一個好習慣嗎?如果是這樣的話,我們應該擴展NSError類。我也檢查過這個文件。但是我看不到NSError的重要提示。
對不起,提出這個問題。我知道在java中我們正在擴展異常類的自定義異常。但是我在目標c中看不到任何場景。擴展NSError是否是一個好習慣
所以我的問題是擴展NSError並引入自定義錯誤是一個好習慣嗎?如果是這樣的話,我們應該擴展NSError類。我也檢查過這個文件。但是我看不到NSError的重要提示。
我從來沒有見過這樣做,這是因爲NSError
已經非常多才多藝。它允許通過設置domain
和code
屬性來定義錯誤類型,並允許在userInfo
字典中附加任意附加信息。
所以,不,這不是好習慣。
欲瞭解更多信息,請查看NSHipster的[NSError文章](http://nshipster.com/nserror/)。到目前爲止,我見過的唯一一個地方有一個巨大的可能的NSErrors列表。 – 2015-09-04 13:32:21
由於它是在Apple文檔中編寫的,因此可以繼承子類。 – Ramis 2015-09-22 10:43:21
儘管我同意你不應該子類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
密鑰變得更容易。同樣,這樣可以更容易地創建更好的錯誤,並且可以更輕鬆地更改錯誤處理的實現細節。
擴展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]);
在文檔編寫,這是確定的子類:
應用程序可以選擇創建NSError的子類,例如, 通過重寫 localizedDescription來提供更好的本地化錯誤字符串。
在我來說,我與OSStatus這是的Int32工作。 NSError構造器僅支持Int。所以我需要將它繼承以支持OSSStatus。
我沒有看到需要,因爲NSError提供了一個域屬性,您可以將其設置爲任何域特定的值。你想用「NSError」子類添加什麼值? – trojanfoe 2014-10-27 13:36:36
我也這麼想。但讓我們說一些場景,例如暴露一些關於錯誤的更多信息。可能是一些特定領域的細節。 – uiroshan 2014-10-27 13:38:44
再次,通過向'userInfo'字典中添加條目已被'NSError'覆蓋。 – trojanfoe 2014-10-27 13:39:41