2016-07-11 17 views
4

In Swift 3.0 können Sie den generischen do-try-catch-Block implementieren, um alle Fehler zu erfassen, die als Ergebnis einer Operation ausgelöst werden . In der Apple-Dokumentation heißt es, einen Enumerator vom Typ ErrorType zu implementieren, der die ausgelösten Fehler auflistet. Angenommen, wir wissen nicht, welche Art von Fehlern von einer Operation ausgelöst werden kann und wie sie implementiert wird. Der folgende Code dient nur zur Veranschaulichung. Hier kann ich den Fehler abfangen, aber ich weiß nicht, was diesen Fehler verursacht. In Ziel C können wir den genauen Grund für den Fehler erhalten, aber hier erhalten wir nur die Informationen, die wir ihm zugewiesen haben.So implementieren Sie den generischen Do-Try-Catch-Block, um alle Fehler zu erfassen, die bei einer Operation ausgelöst werden

Ich habe eine Lösung für meine Frage gefunden.Code-Struktur ist unten aufgeführt.

do { 
    let str = try NSString(contentsOfFile: "Foo.bar",encoding: NSUTF8StringEncoding) 
    print(str) 
} 
catch let error as NSError { 
    print(error.localizedDescription) 
} 

Below Code funktioniert, weil nicht Ausdruck versuchen zurückgibt nil .Um einen Fehler werfen Ausdruck versuchen sollte, einen Fehler zurück und kein Null-Wert. Typ-Cast-Operation ist optional.

do { 
    let intval = try Int("123q") 
    print(Int("\(intval)")) 
} 
catch let error as NSError { 
    print(error.localizedDescription) 
} 
+0

Sie können für ErrorType * und * für andere Typen abfangen. Beispiel im Code dieser Antwort: http://stackoverflow.com/a/31808605/2227743. (Die Antwort von appzyourLife funktioniert auch). – Moritz

+0

Danke Eric. Ihr enum wird in Ihrem Anwendungsfall gut funktionieren, da Sie im Voraus wissen, dass die Antwort einer Anfrage ein nsdata haben sollte und es in jSon konvertiert werden sollte. In meinem Fall weiß ich nicht einmal, was möglicher Fehler ist, der von einer Operation geworfen werden kann. Ich will es allgemein sein, der alle möglichen Fehler erfasst. – Jinil

+0

Es ist nur ein Beispiel, um Ihnen zu zeigen, dass Sie definierte Fehler abfangen können, die mit ErrorType übereinstimmen, * und * NSError-Einsen fangen, * die Sie im Voraus nicht kennen *. :) Und du kannst * auch * einen generischen Fang wie appzyourLifes hinzufügen, wenn du willst. – Moritz

Antwort

0

Sie können einfach catch verwenden, um jede Art von Fehler zu erfassen.

do { 
    try foo() 
} catch { 
    print(error) 
} 
+0

Danke appzYourLife. Wie wollen Sie einen Fehler von foo() werfen? Bitte beachten Sie, ich möchte eine allgemeine Antwort erhalten, warum der Vorgang fehlgeschlagen ist. – Jinil

+0

@Jinil: Die Funktion muss folgendermaßen definiert werden: 'func foo() wirft {...}' –