2014-10-27 10 views
7

zu erweitern Entschuldigung, dass Sie diese Frage gestellt haben. Ich weiß in Java, wir erweitern Exception-Klasse für benutzerdefinierte Ausnahmen. Aber dafür sehe ich keine Szenarien in Ziel c.Ist es eine gute Übung, NSError

Also meine Frage, ist es eine gute Praxis, NSError zu erweitern und benutzerdefinierte Fehler einzuführen? Wenn ja, wann sollten wir die NSError-Klasse erweitern. Ich habe auch die Dokumentation überprüft. Aber ich kann keine übersteuernden Notizen für NSError sehen.

+5

Ich sehe nicht die Notwendigkeit als 'NSError' bietet eine Domain-Eigenschaft, die Sie festlegen können, was auch immer Domain-spezifischen Wert. Welchen Wert möchten Sie mit einer Unterklasse "NSError" hinzufügen? – trojanfoe

+1

Ich dachte genauso. Aber lassen Sie uns Szenarien sagen, die mehr Informationen über den Fehler enthalten. Möglicherweise einige domänenspezifische Details. – uiroshan

+4

Erneut, bereits von 'NSError' durch das Hinzufügen von Einträgen zum' userInfo'-Dictionary abgedeckt. – trojanfoe

Antwort

6

Ich habe es noch nie gesehen und das ist, weil NSError bereits sehr vielseitig ist. Es ermöglicht die Festlegung des Fehlertyps durch Setzen der Eigenschaften domain und code und ermöglicht das Hinzufügen beliebiger zusätzlicher Informationen innerhalb des userInfo Wörterbuchs.

Also, nein, es ist keine gute Übung.

+0

Für weitere Informationen besuchen Sie [NSError Artikel] (http://shipster.com/nserror/) von NSHipster. Bis jetzt hat der einzige Ort, an dem ich gesehen habe, eine riesige Liste möglicher NSErrors an einem Ort. –

+1

Es ist in Ordnung, Unterklassen, wie es in einer Apple-Dokumentation geschrieben ist. – Ramis

13

Während ich zustimme, dass Sie keine Unterklasse NSError, es ist sehr nützlich, um Kategorien, und ich mache dies regelmäßig. Angenommen, Ihr System veröffentlicht häufig Fehler, die von einem JSON-Block stammen. Ich würde es sehr praktisch finden, wie eine Kategorie zu erstellen:

@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 

ich oft kleine Helfer schreiben NSError einfacher zu konstruieren, bauen die Userinfo, wie ich will, und die Pull-Daten wieder aus dem Userinfo ohne Anrufer muss seine interne Repräsentation kennen. Ich halte dies für eine sehr gute Form der Datenverbergung und ermutige dazu, aussagekräftigere Nachrichten zu verwenden.

Ähnlich, auch für kleinere Projekte, erstelle ich oft eine +myErrorWithCode:localizedDescription: Kategorie-Methode. Ich kenne meine Domain, daher muss ich sie normalerweise nicht weitergeben, und das macht es viel einfacher, den Schlüssel NSLocalizedDescription in den Benutzerinformationen festzulegen. Dies führt wiederum zu besseren Fehlern, da sie einfacher zu erstellen sind, und erleichtert die Änderung der Implementierungsdetails Ihrer Fehlerbehandlung.

0

Es ist keine schlechte Idee, NSError zu erweitern. Ich habe auch eine Kategorie auf NSError für meinen eigenen Gebrauch gemacht. Ich würde es gerne mit dir teilen.

(1) Erstellen Sie eine strings Datei alle Fehlercodes zu definieren:

/* 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) Machen Sie eine Kategorie auf NSError, sagen wir mal "NSError + Errorinfo":

@interface NSError (ErrorInfo) 

-(NSString *)userDescription; 

@end 

(3) definieren es:

Machen

(4) Gebrauch davon:

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

In der Dokumentation steht geschrieben, dass es in Ordnung zu Unterklasse ist:

Anwendungen können wählen Subklassen von NSError zu schaffen, zum Beispiel , , um bessere lokalisierte Fehlerzeichenfolgen durch Überschreiben von localizedDescription bereitzustellen.

In meinem Fall arbeite ich mit OSStatus die Int32 ist. NSError-Konstruktor unterstützt nur Int. Also muss ich es unterteilen, um OSSStatus zu unterstützen.

Verwandte Themen