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)»