web-dev-qa-db-de.com

Versuch es! & Versuchen? Was ist der Unterschied und wann soll jeder verwendet werden?

In Swift 2. , Apple hat eine neue Methode zum Behandeln von Fehlern eingeführt (do-try-catch). Vor einigen Tagen wurde in Beta 6 ein noch neueres Schlüsselwort eingeführt ( try?). Wusste auch, dass ich try!. Was ist der Unterschied zwischen den 3 Schlüsselwörtern und wann werden sie verwendet?

159
Abdurrahman

Aktualisiert für Swift 5.1

Nehmen Sie die folgende Wurffunktion an:

enum ThrowableError: Error {

    case badError(howBad: Int)
}

func doSomething(everythingIsFine: Bool = false) throws -> String {

  if everythingIsFine {
      return "Everything is ok"
  } else {
      throw ThrowableError.badError(howBad: 4)
  }
}

versuchen

Sie haben zwei Möglichkeiten, wenn Sie versuchen, eine Funktion aufzurufen, die möglicherweise ausgelöst wird.

Sie können die Verantwortung für Fehlerbehandlung übernehmen, indem Sie Ihren Anruf in einem Do-Catch-Block einschließen:

do {
    let result = try doSomething()
}
catch ThrowableError.badError(let howBad) {
    // Here you know about the error
    // Feel free to handle or to re-throw

    // 1. Handle
    print("Bad Error (How Bad Level: \(howBad)")

    // 2. Re-throw
    throw ThrowableError.badError(howBad: howBad)
}

Oder rufen Sie einfach die Funktion auf und geben Sie den Fehler weiter an den nächsten Aufrufer in der Aufrufkette:

func doSomeOtherThing() throws -> Void {    
    // Not within a do-catch block.
    // Any errors will be re-thrown to callers.
    let result = try doSomething()
}

versuchen!

Was passiert, wenn Sie versuchen, auf ein implizit entpacktes optionales Element mit einer Null darin zuzugreifen? Ja, stimmt, die App wird abstürzen! Gleiches gilt für try! Grundsätzlich wird die Fehlerkette ignoriert und eine "do or die" Situation deklariert. Wenn die aufgerufene Funktion keine Fehler verursacht hat, ist alles in Ordnung. Aber wenn es fehlgeschlagen ist und ein Fehler aufgetreten ist, Ihre Anwendung stürzt einfach ab.

let result = try! doSomething() // if an error was thrown, CRASH!

versuchen?

Ein neues Schlüsselwort, das in Xcode 7 Beta 6 eingeführt wurde. Es gibt ein optionales zurück, das erfolgreiche Werte auspackt und einen Fehler abfängt, indem es nil zurückgibt.

if let result = try? doSomething() {
    // doSomething succeeded, and result is unwrapped.
} else {
    // Ouch, doSomething() threw an error.
}

Oder wir können Wache verwenden:

guard let result = try? doSomething() else {
    // Ouch, doSomething() threw an error.
}
// doSomething succeeded, and result is unwrapped.

Eine letzte Anmerkung hier, mit try? Beachten Sie, dass Sie den aufgetretenen Fehler verwerfen, da er in eine Null übersetzt wurde. Versuch benutzen? wenn Sie sich mehr auf Erfolge und Misserfolge konzentrieren und nicht darauf, warum etwas fehlgeschlagen ist.

Coalescing Operator verwenden ??

Sie können den Koaleszenzoperator verwenden? mit versuchen? So geben Sie einen Standardwert für den Fehlerfall an:

let result = (try? doSomething()) ?? "Default Value"
print(result) // Default Value
297
Abdurrahman