¿Cómo imprimir detalles de una excepción de 'captura todo' en Swift?

84

Estoy actualizando mi código para usar Swift y me pregunto cómo imprimir los detalles del error para una excepción que coincide con la cláusula 'catch all'. Modifiqué ligeramente el ejemplo de esta página de la guía de idiomas Swift para ilustrar mi punto:

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

Si detecto una excepción inesperada, necesito poder registrar algo sobre su causa.

markdb314
fuente

Respuestas:

121

Me lo imaginé. Noté esta línea en la documentación de Swift:

Si una cláusula catch no especifica un patrón, la cláusula coincidirá y vinculará cualquier error a una constante local denominada error

Entonces, probé esto:

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

Y me dio una bonita descripción.

markdb314
fuente
47

Desde el lenguaje de programación Swift :

Si una catchcláusula no especifica un patrón, la cláusula coincidirá y vinculará cualquier error a una constante local nombrada error.

Es decir, hay un implícito let erroren la catchcláusula:

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

Alternativamente, parece que let constant_nametambién es un patrón válido, por lo que podría usarlo para cambiar el nombre de la constante de error (esto podría ser útil si el nombre errorya está en uso):

do {
    // …
} catch let myError {
   print("caught: \(myError)")
}
Arkku
fuente