Jak wydrukować szczegóły wyjątku „złap wszystko” w Swift?

84

Aktualizuję kod, aby korzystał z języka Swift i zastanawiam się, jak wydrukować szczegóły błędu dla wyjątku pasującego do klauzuli „catch all”. Lekko zmodyfikowałem przykład z tej strony przewodnika po Swift, aby zilustrować mój punkt widzenia:

do {
    try vend(itemNamed: "Candy Bar")
    // Enjoy delicious snack
} catch VendingMachineError.InvalidSelection {
    print("Invalid Selection.")
} catch VendingMachineError.OutOfStock {
    print("Out of Stock.")
} catch VendingMachineError.InsufficientFunds(let amountRequired) {
    print("Insufficient funds. Please insert an additional $\(amountRequired).")
} catch {
    // HOW DO I PRINT OUT INFORMATION ABOUT THE ERROR HERE?
}

Jeśli złapię nieoczekiwany wyjątek, muszę być w stanie zarejestrować coś o tym, co go spowodowało.

markdb314
źródło

Odpowiedzi:

121

Właśnie to rozgryzłem. Zauważyłem tę linię w Swift Documentation:

Jeśli klauzula catch nie określa wzorca, klauzula dopasuje i powiąże każdy błąd z lokalną stałą o nazwie error

Więc spróbowałem tego:

do {
    try vend(itemNamed: "Candy Bar")
...
} catch {
    print("Error info: \(error)")
}

I dał mi ładny opis.

markdb314
źródło
47

Z języka szybkiego programowania :

Jeśli catchklauzula nie określa wzorca, klauzula dopasuje i powiąże każdy błąd ze stałą lokalną o nazwie error.

Oznacza to, że let errorw catchklauzuli znajduje się domniemany :

do {
    // …
} catch {
    print("caught: \(error)")
}

Alternatywnie wydaje się, że let constant_namejest to również prawidłowy wzorzec, więc możesz go użyć do zmiany nazwy stałej błędu (może to być przydatne, jeśli nazwa errorjest już używana):

do {
    // …
} catch let myError {
   print("caught: \(myError)")
}
Arkku
źródło