No he leído demasiado en Swift, pero una cosa que noté es que no hay excepciones. Entonces, ¿cómo hacen el manejo de errores en Swift? ¿Alguien ha encontrado algo relacionado con el manejo de errores?
swift
error-handling
peko
fuente
fuente
Respuestas:
Swift 2 y 3
Las cosas han cambiado un poco en Swift 2, ya que hay un nuevo mecanismo de manejo de errores, que es algo más similar a las excepciones pero diferente en detalles.
1. Indicando posibilidad de error
Si la función / método quiere indicar que puede arrojar un error, debe contener una
throws
palabra clave como estaNota: no existe una especificación para el tipo de error que la función realmente puede arrojar. Esta declaración simplemente establece que la función puede lanzar una instancia de cualquier tipo que implemente ErrorType o que no arroje nada.
2. Función de invocación que puede arrojar errores
Para invocar la función, debe usar la palabra clave try, como esta
esta línea normalmente debería estar presente bloque do-catch como este
Nota: la cláusula catch utiliza todas las potentes funciones de la coincidencia de patrones Swift para que sea muy flexible aquí.
Puede decidir propagar el error, si está llamando a una función de lanzamiento desde una función que está marcada con la
throws
palabra clave:Alternativamente, puede llamar a la función de lanzamiento usando
try?
:De esta forma, obtiene el valor de retorno o nulo, si se produce algún error. De esta manera no obtienes el objeto de error.
Lo que significa que también se puede combinar
try?
con declaraciones útiles como:o
Finalmente, puede decidir que sabe que el error no ocurrirá realmente (por ejemplo, porque ya lo ha verificado son requisitos previos) y usar la
try!
palabra clave:Si la función realmente arroja un error, obtendrá un error de tiempo de ejecución en su aplicación y la aplicación finalizará.
3. Lanzar un error
Para lanzar un error, usa la palabra clave throw como esta
Puede lanzar cualquier cosa que se ajuste al
ErrorType
protocolo. Para empezar,NSError
cumple con este protocolo, pero es probable que desee utilizar un método basado en enumeraciónErrorType
que le permita agrupar múltiples errores relacionados, potencialmente con datos adicionales, como esteLas principales diferencias entre el nuevo mecanismo de error Swift 2 y 3 y las excepciones de estilo Java / C # / C ++ son las siguientes:
do-catch
+try
+defer
frente a latry-catch-finally
sintaxis tradicional .do-catch
bloqueo no detectará ninguna NSException, y viceversa, para eso debe usar ObjC.NSError
convenciones del método Cocoa de devolverfalse
(paraBool
devolver funciones) onil
(paraAnyObject
devolver funciones) y pasarNSErrorPointer
con detalles de error.Como un azúcar sintético adicional para facilitar el manejo de errores, hay dos conceptos más
defer
palabras clave) que le permiten lograr el mismo efecto que finalmente bloquea en Java / C # / etc.guard
palabra clave) que le permite escribir un poco menos de código if / else que en el código normal de comprobación / señalización de erroresSwift 1
Errores de tiempo de ejecución:
Como Leandros sugiere para manejar errores de tiempo de ejecución (como problemas de conectividad de red, análisis de datos, abrir archivos, etc.), debe usar
NSError
como lo hizo en ObjC, porque Foundation, AppKit, UIKit, etc. informan sus errores de esta manera. Entonces es más una cuestión de marco que de lenguaje.Otro patrón frecuente que se está utilizando son los bloques de éxito / falla del separador como en AFNetworking:
Aún así, el bloque de falla recibió con frecuencia la
NSError
instancia, que describe el error.Errores de programador:
Para los errores del programador (como el acceso fuera de los límites del elemento de matriz, los argumentos no válidos pasados a una llamada de función, etc.), usó excepciones en ObjC. Swift lenguaje no parecen tener ningún soporte de idiomas para las excepciones (como
throw
,catch
, etc palabra clave). Sin embargo, como la documentación sugiere, se está ejecutando en el mismo tiempo de ejecución que ObjC y, por lo tanto, aún puede lanzar deNSExceptions
esta manera:Simplemente no puede atraparlos en Swift puro, aunque puede optar por capturar excepciones en el código ObjC.
La pregunta es si debe lanzar excepciones para errores de programador, o más bien usar aserciones como Apple sugiere en la guía del lenguaje.
fuente
fatalError(...)
es lo mismo también.Actualización 9 de junio de 2015 - Muy importante
Swift 2.0 viene con
try
,throw
ycatch
palabras clave y lo más emocionante es:Extracto de: Apple Inc. "Uso de Swift con Cocoa y Objective-C (Presentación preliminar de Swift 2)". iBooks
Ejemplo: (del libro)
El equivalente en swift será:
Lanzar un error:
Se propagará automáticamente a la persona que llama:
De los libros de Apple, The Swift Programming Language parece que los errores deberían manejarse usando enum.
Aquí hay un ejemplo del libro.
De: Apple Inc. "El lenguaje de programación Swift". iBooks https://itun.es/br/jEUH0.l
Actualizar
De los libros de noticias de Apple, "Uso de Swift con Cocoa y Objective-C". Las excepciones de tiempo de ejecución no se producen con lenguajes rápidos, por eso no tiene try-catch. En su lugar, utiliza el encadenamiento opcional .
Aquí hay un tramo del libro:
Extracto de: Apple Inc. "Uso de Swift con Cocoa y Objective-C". iBooks https://itun.es/br/1u3-0.l
Y los libros también lo alientan a usar el patrón de error de cacao de Objective-C (NSError Object)
Extracto de: Apple Inc. "Uso de Swift con Cocoa y Objective-C". iBooks https://itun.es/br/1u3-0.l
fuente
No hay excepciones en Swift, similar al enfoque de Objective-C.
En el desarrollo, puede utilizar
assert
para detectar cualquier error que pueda aparecer, y debe repararse antes de pasar a producción.El
NSError
enfoque clásico no se modifica, envía un mensajeNSErrorPointer
, que se completa.Breve ejemplo:
fuente
f();g();
conviertaf(&err);if(err) return;g(&err);if(err) return;
durante el primer mes, luego simplemente se conviertaf(nil);g(nil);hopeToGetHereAlive();
El 'Swift Way' recomendado es:
Sin embargo, prefiero probar / atrapar ya que me resulta más fácil de seguir porque mueve el manejo de errores a un bloque separado al final, esta disposición a veces se llama "Ruta Dorada". Por suerte, puedes hacer esto con los cierres:
También es fácil agregar un recurso de reintento:
El listado de TryBool es:
Puede escribir una clase similar para probar un valor devuelto Opcional en lugar del valor Bool:
La versión TryOptional aplica un tipo de retorno no opcional que facilita la programación posterior, por ejemplo, 'Swift Way:
Usando TryOptional:
Tenga en cuenta el desempaquetado automático.
fuente
Editar: aunque esta respuesta funciona, es poco más que Objective-C transcrito en Swift. Se ha vuelto obsoleto por los cambios en Swift 2.0. La respuesta anterior de Guilherme Torres Castro es una muy buena introducción a la forma preferida de manejar errores en Swift. VOS
Me costó un poco descubrirlo, pero creo que lo he sospechado. Aunque parece feo. Nada más que un skin delgado sobre la versión Objective-C.
Llamar a una función con un parámetro NSError ...
Escribiendo la función que toma un parámetro de error ...
fuente
Contenedor básico alrededor del objetivo C que le brinda la función de captura de prueba. https://github.com/williamFalcon/Swift TryCatch
Usar como:
fuente
Esta es una respuesta de actualización para swift 2.0. Estoy esperando un modelo de manejo de errores rico en funciones como en Java. Finalmente, anunciaron las buenas noticias. aquí
p.ej :
fuente
Como dijo Guilherme Torres Castro, en Swift 2,0,
try
,catch
,do
puede ser utilizado en la programación.Por ejemplo, en el método de recuperación de datos CoreData, en lugar de ponerlo
&error
como parámetro en elmanagedContext.executeFetchRequest(fetchRequest, error: &error)
, ahora solo necesitamos usarmanagedContext.executeFetchRequest(fetchRequest)
y luego manejar el error contry
,catch
( Apple Document Link )Si ya ha descargado la xcode7 Beta. Intente buscar errores de lanzamiento en Documentaciones y Referencia de API y elija el primer resultado que se muestra, da una idea básica de lo que se puede hacer para esta nueva sintaxis. Sin embargo, todavía no se ha publicado toda la documentación para muchas API.
Se pueden encontrar técnicas más sofisticadas de manejo de errores en
fuente
El manejo de errores es una nueva característica de Swift 2.0. Utiliza los
try
,throw
ycatch
palabras clave.Vea el anuncio de Apple Swift 2.0 en el blog oficial de Apple Swift
fuente
Agradable y simple lib para manejar la excepción: TryCatchFinally-Swift
Al igual que algunos otros, se ajusta a las características de excepción objetivas de C.
Úselo así:
fuente
Comenzando con Swift 2, como otros ya han mencionado, el manejo de errores se logra mejor mediante el uso de las enumeraciones do / try / catch y ErrorType. Esto funciona bastante bien para los métodos sincrónicos, pero se requiere un poco de inteligencia para el manejo de errores asincrónicos.
Este artículo tiene un gran enfoque para este problema:
https://jeremywsherman.com/blog/2015/06/17/using-swift-throws-with-completion-callbacks/
Para resumir:
entonces, la llamada al método anterior sería la siguiente:
Esto parece un poco más limpio que tener una devolución de llamada de errorHandler por separado pasada a la función asincrónica, que era cómo se manejaría esto antes de Swift 2.
fuente
Lo que he visto es que, debido a la naturaleza del dispositivo, no desea lanzar un montón de mensajes crípticos de manejo de errores al usuario. Es por eso que la mayoría de las funciones devuelven valores opcionales, entonces solo codifica para ignorar los opcionales. Si una función vuelve nula, lo que significa que falló, puede hacer estallar un mensaje o lo que sea.
fuente