unreachable try thrown the not here handled from exhaustive example errors error enclosing create catch because are ios macos swift error-handling

ios - try - swift throw error



Cómo encontrar el tipo de errores que un método puede lanzar y atraparlos en Swift (3)

Lo que está pidiendo en la parte de "actualización" no es posible. Es la decisión de la función de lanzar hacerle saber qué puede lanzar, o no mostrarlo, y luego necesita manejar un error genérico.

Muchas funciones revelan información sobre los errores lanzados, por ejemplo:

func startVPNTunnel() throws Description Start the process of connecting the VPN true if the process of connecting the VPN started successfully, false if an error occurred. Parameters error A pointer to a pointer to an NSError object. If specified and the VPN connection process cannot be started due to an error, this parameter will be set to point to an NSError object containing details about the error. See NEVPNManager Class Reference for a list of possible errors.

Edición: una posible razón para esto: de esa manera, la función de lanzamiento puede cambiar los errores que arroja, y todo el código que detecte esos errores seguirá siendo válido.

Esta pregunta ya tiene una respuesta aquí:

Estoy usando NSFileManager.contentsOfDirectoryAtPath para obtener una matriz de nombres de archivos en un directorio. Quiero usar la nueva sintaxis do-try-catch para manejar los errores:

do { let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) } catch { // handle errors print(error) // this is the best I can currently do }

Puedo docsPath que un error podría ser que docsPath no existe, pero no sé cómo detectar este error. Y no sé qué otros errores posibles pueden ocurrir.

Ejemplo de documentacion

La documentación de manejo de errores tiene un ejemplo como este.

enum VendingMachineError: ErrorType { case InvalidSelection case InsufficientFunds(centsNeeded: Int) case OutOfStock }

y

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 amountNeeded) { print("Insufficient funds. Please insert an additional /(amountNeeded) cents.") }

pero no sé cómo hacer algo similar para detectar los errores de los tipos Swift estándar que tienen métodos que utilizan la palabra clave throws .

La referencia de clase NSFileManager para contentsOfDirectoryAtPath no indica qué tipo de errores pueden devolverse. Así que no sé qué errores detectar o cómo manejarlos si los obtengo.

Actualizar

Me gustaría hacer algo como esto:

do { let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) } catch FileManagerError.PathNotFound { print("The path you selected does not exist.") } catch FileManagerError.PermissionDenied { print("You do not have permission to access this directory.") } catch ErrorType { print("An error occured.") }


Se devolverá NSError:

let fileManager = NSFileManager() do { let docsArray = try fileManager.contentsOfDirectoryAtPath("/") } catch let error as NSError { // handle errors print(error.localizedDescription) // The file “Macintosh HD” couldn’t be opened because you don’t have permission to view it. }


NSError se NSError automáticamente a ErrorType donde el dominio se convierte en el tipo (por ejemplo, NSCocoaErrorDomain convierte en NSCocoaError ) y el código de error se convierte en el valor ( NSFileReadNoSuchFileError convierte en .FileReadNoSuchFileError )

import Foundation let docsPath = "/file/not/found" let fileManager = NSFileManager() do { let docsArray = try fileManager.contentsOfDirectoryAtPath(docsPath) } catch NSCocoaError.FileReadNoSuchFileError { print("No such file") } catch { // other errors print(error) }

En cuanto a saber qué error puede devolver una llamada específica, solo la documentación puede ayudar. Casi todos los errores de Foundation son parte del dominio NSCocoaError y se pueden encontrar en FoundationErrors.h (aunque hay algunos errores raros en los que Foundation también puede devolver errores de POSIX bajo NSPOSIXErrorDomain ), pero es posible que estos no hayan sido completamente solucionados, por lo que tendrá que NSError a su gestión en el nivel NSError .

Se puede encontrar más información en «Uso de Swift con Cocoa y Objective-C (Swift 2.2)»