Как распечатать детали исключения "поймать все" в Swift?

84

Я обновляю свой код для использования Swift, и мне интересно, как распечатать сведения об ошибке для исключения, которое соответствует предложению «поймать все». Я немного изменил пример со страницы руководства по языку Swift, чтобы проиллюстрировать свою точку зрения:

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

Если я поймаю неожиданное исключение, мне нужно будет что-то записать о том, что его вызвало.

markdb314
источник

Ответы:

122

Я только что разобрался. Я заметил эту строку в документации Swift:

Если в предложении catch не указан шаблон, оно будет сопоставлять любую ошибку и связывать ее с локальной константой с именем error.

Итак, я попробовал это:

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

И это дало мне хорошее описание.

markdb314
источник
47

Из языка программирования Swift :

Если в catchпредложении не указан шаблон, оно будет сопоставлять любую ошибку и связывать ее с локальной константой с именем error.

То есть, есть неявный let errorв catchстатье:

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

В качестве альтернативы кажется, что let constant_nameэто также действительный шаблон, поэтому вы можете использовать его для переименования константы ошибки (это, вероятно, может быть удобно, если имя errorуже используется):

do {
    // …
} catch let myError {
   print("caught: \(myError)")
}
Аркку
источник