2016-06-15 10 views
2

Ich bekomme, wie ich meine eigenen Fehler erstellen und sie in Swift mit dem throws Schlüsselwort auslösen kann. Was ich nicht bekomme ist, wie man das reguläre try - catch in anderen Sprachen (oder das Ruby rescue) für nicht behandelte Ausnahmen repliziert.Wie benutzt man Try-Catch in Swift?

Beispiel (In Swift):

func divideStuff(a: Int, by: Int) -> Int { 
    return a/by 
} 

let num = divideStuff(4, by: 0) //divide by 0 exception 

Hier ist, wie ich mit ihm in C#, zum Beispiel beschäftigen würde:

int DivideStuff(int a, int b) { 
    int result; 
    try { 
    result = a/b; 
    } 
    catch { 
    result = 0; 
    } 
    return result; 
} 

Wie kann ich das gleiche mit Swift erreichen?

+0

Es ist 'do' ..' catch' im doc: https://developer.apple.com/ Bibliothek/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ErrorHandling.html – Jonas

+1

Sie * können nicht beliebige Laufzeitausnahmen (wie Division durch Null) mit try/catch fangen, vergleichen http://stackoverflow.com/questions/34628999/swift -force-unwrapping-exception-not-propagiert für eine ähnliche Frage und verweist auf die Dokumentation. –

Antwort

0

In Swift gibt es keine Funktionalität, um beliebige Laufzeitfehler abzufangen.
Der Entwickler ist dafür verantwortlich, die Fehler ordnungsgemäß zu behandeln.

Zum Beispiel

func divideStuff(a : Int, b : Int) -> Int { 
    if b == 0 { return 0 } 
    return a/b 
} 
+1

Danke. Ich wusste nicht, dass Swift nicht in der Lage ist, willkürliche Laufzeitfehler zu erfassen. Irgendwie fühlt sich das komisch an. – ilovebigmacs

+0

Das erklärt nicht wirklich einen Versuch/Fang - das ist gut, aber es ist defensive Programmierung. – geekyaleks

2

Sie können auch es so behandeln:

enum MyErrors: ErrorType { 
    case DivisionByZero 
} 

func divideStuff(a: Int, by: Int) throws -> Int { 
    if by == 0 { 
    throw MyErrors.DivisionByZero 
    } 
    return a/by 
} 

let result: Int 

do { 
    result = try divideStuff(10, by: 0) 
} catch { 
    // ... 
} 
+0

Möglicherweise möchten Sie der do/catch-Anweisung einen Catch-Let-Fehler als NSError hinzufügen, damit der Fehler im Catch-Abschnitt identifiziert werden kann – Ike10