Як надрукувати деталі винятку "спіймати усіх" у Swift?


84

Я оновлюю свій код, щоб використовувати Swift, і мені цікаво, як надрукувати детальну інформацію про помилку для винятку, який відповідає реченню “catch all”. Я трохи модифікував приклад із цієї сторінки швидкого мовного довідника, щоб проілюструвати свою думку:

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?
}

Якщо я виявив несподіваний виняток, мені потрібно вміти щось реєструвати про те, що його спричинило.

Відповіді:


121

Я просто зрозумів це. Я помітив цей рядок у документації Swift:

Якщо речення catch не вказує шаблон, речення буде відповідати і прив'язувати будь-яку помилку до локальної константи з іменем помилки

Отже, я спробував це:

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

І це дало мені приємний опис.


47

Зі швидкої мови програмування :

Якщо catchречення не вказує шаблон, речення буде відповідати і прив'язувати будь-яку помилку до локальної константи з іменем error.

Тобто let errorв catchпункті є імпліцит :

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

З іншого боку, здається, що let constant_nameце також допустимий шаблон, тому ви можете використовувати його для перейменування константи помилки (це, можливо, може бути корисним, якщо ім’я errorвже використовується):

do {
    // …
} catch let myError {
   print("caught: \(myError)")
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.