2017-07-14 2 views
1

Fangklauseln in Swift müssen erschöpfend sein. Bedeutet das, dass ich immer einen Platzhalter oder leere Catch-Klauseln verwenden muss, wenn ich die Fehlerfortpflanzung vermeiden möchte? Beispiel:Erschöpfende Fangblöcke ohne Leer- oder Wildcard in Swift 3.1

enum Oops: Error { 
    case oh, ouch, meh 
} 

func troublemaker() { 
    do { throw Oops.meh } 
    catch Oops.oh {} 
    catch Oops.ouch {} 
    catch Oops.meh {} 
    // Error: Error is not handled because the enclosing catch is not exhaustive 
} 

Natürlich ist es fest, wenn ich throws auf die Funktion hinzuzufügen. Dasselbe gilt für das Hinzufügen entweder catch {} oder catch _ {}.

Aber gibt es eine Möglichkeit, erschöpfende Fangblöcke auf andere Weise zu machen? Wie vielleicht, den zulässigen Typ des Fehlers zu definieren, um zu werfen, also würde mein Enum-Fehler es erschöpfend machen?

+1

Sie können nicht angeben, welche Fehler geworfen werden. Vergleichen Sie https://stackoverflow.com/questions/39618095/cani-restrict-the-type-that-a-function-throws-in-swift oder https://stackoverflow.com/questions/30740997/what-is -the-difference-zwischen-swift-2-0-do-try-catch-und-regulär-java-cc-ex. –

+1

Siehe auch https://stackoverflow.com/q/40718542/2976878 – Hamish

Antwort

0

Wenn Sie einfach nicht die mehrere catch-Blöcke mögen, alle Fehler fangen auf einmal und wechseln Sie dann Fehlertypen

func troublemaker() { 
    do { throw Oops.meh } 
    catch let error{ 
     switch error { 
     case Oops.meh: 
      print("It works!") 
      break 
     default: 
      print("Oops something else is wrong") 
      break 
     } 
    } 
}