2016-08-08 48 views
33

Ich migriere meinen Code auf Swift 3 und sehe eine Reihe derselben Warnungen mit meinen do/try/catch-Blöcken. Ich möchte prüfen, ob eine Zuweisung nicht Null zurückgibt und dann etwas auf die Konsole drucken, wenn es nicht funktioniert. Der Catch-Block sagt, dass er "nicht erreichbar ist, weil keine Fehler geworfen werden". Ich möchte alle Fehler mit einem Catch-Block abfangen.Fehlerbehandlung in Swift 3

let xmlString: String? 
    do{ 
     //Warning for line below: "no calls to throwing function occurs within 'try' expression 
     try xmlString = String(contentsOfURL: accessURL, encoding: String.Encoding.utf8) 

     var xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString) 
     if let models = xmlDict?["Cygnet"] { 
      self.cygnets = models as! NSArray 
     } 

    //Warning for line below: "catch block is unreachable because no errors are thrown in 'do' block 
    } catch { 
     print("error getting xml string") 
    } 

Wie würde ich einen richtigen try catch-Block schreiben, der mit Zuordnungsfehlern umgehen würde?

+0

Tatsächlich ist die 'try' geschrieben kurz vor dem Werfen Methode werden müssen, anstatt vor dem Variable, die das Ergebnis enthält - 'xmlString = try String (...' aber wirft diese Methode wirklich ** einen Fehler in Swift 3? – vadian

+0

Die einzige Sache ist, wenn sie eine Zuweisung von null zurückgibt. Warum würde der catch blockieren aber immer noch unerreichbar? – Bleep

+2

Ein 'do - catch' Block req hat mindestens eine Methode, die einen Fehler auslöst. 'String (contentsOfURL:' scheint dies nicht zu tun. Übrigens: Ich bezweifle, dass 'String (contentsOfURL: 'wird in Swift 3 – vadian

Antwort

54

Ein Weg, den Sie tun können, ist, Ihre eigenen Fehler zu werfen, um Null zu finden.

Mit dieser Art von Ihrem eigenen Fehler mit:

enum MyError: Error { 
    case FoundNil(String) 
} 

Sie so etwas schreiben kann:

do{ 
     let xmlString = try String(contentsOf: accessURL, encoding: String.Encoding.utf8) 
     guard let xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString) else { 
      throw MyError.FoundNil("xmlDict") 
     } 
     guard let models = xmlDict["Cygnet"] as? NSArray else { 
      throw MyError.FoundNil("models") 
     } 
     self.cygnets = models 
    } catch { 
     print("error getting xml string: \(error)") 
    } 
+32

+1, um zu demonstrieren, dass in einem Catch, dass "error" nicht mit einem Muster übereinstimmen muss, der Bezeichner "error" automatisch definiert wird. – Kaydell

+0

Sie können dies auch versuchen : 'var Fehler: NSError? = Nil tun { try // Ihre Methode, die Fehler wirft} catch lassen fetchError als NSError { error = fetchError // mit dem zurückgegebenen Fehler Spielen } ' – Torongo

+0

@NaGibToroNgo, verstehen Sie, dass die OP fragt, wie man handle 'nil' checking do-try-catch? Dein Code enthält nichts über 'nil' Prüfung. – OOPer