ios - thrown - try catch error swift
¿Cómo debo usar NSSetUncaughtExceptionHandler en Swift? (3)
Actualizar
Con Swift 2, puede pasar las funciones y cierres de Swift como puntero de función C. Vea la respuesta de Martin R a continuación .
Respuesta original
No se puede, a partir de Xcode 6 beta 6.
Swift admite la transmisión de punteros de función, pero se tratan de forma muy parecida a los punteros opacos. No puede definir un puntero de función C a una función Swift ni puede llamar a un puntero de función C en Swift.
Eso significa que usted llama a NSSetUncaughtExceptionHandler()
desde Swift, pero el controlador debe implementarse en Objective-C. Necesitas un archivo de encabezado como este:
volatile void exceptionHandler(NSException *exception);
extern NSUncaughtExceptionHandler *exceptionHandlerPtr;
y en la implementación, necesitas algo como esto:
volatile void exceptionHandler(NSException *exception) {
// Do stuff
}
NSUncaughtExceptionHandler *exceptionHandlerPtr = &exceptionHandler;
Después de importar el archivo de encabezado en el encabezado de puente de Swift, puede configurar el controlador de excepciones como de costumbre:
NSSetUncaughtExceptionHandler(exceptionHandlerPtr)
En Objective-C, llamo al NSSetUncaughtExceptionHandler(&exceptionHandler)
para registrar excepciones. ¿Cómo se llama en Swift?
A partir de Swift 2 (Xcode 7), puede pasar las funciones / cierres de Swift a los parámetros que toman un puntero a la función C. De las notas de lanzamiento de Xcode 7:
Soporte nativo para punteros de función C: las funciones de C que toman argumentos de puntero de función pueden llamarse mediante cierres o funciones globales, con la restricción de que el cierre no debe capturar ninguno de su contexto local.
Así que esto compila y funciona:
func exceptionHandler(exception : NSException) {
print(exception)
print(exception.callStackSymbols)
}
NSSetUncaughtExceptionHandler(exceptionHandler)
O con un cierre "en línea":
NSSetUncaughtExceptionHandler { exception in
print(exception)
print(exception.callStackSymbols)
}
Esto hace exactamente lo mismo que el código correspondiente de Objective-C: atrapa los NSException
no NSException
. Así que esto será atrapado:
let array = NSArray()
let elem = array.objectAtIndex(99)
NOTA: - No detecta ningún error de Swift 2 (desde el throw
) ni los errores de Swift en tiempo de ejecución, por lo que no se detecta:
let arr = [1, 2, 3]
let elem = arr[4]
El error que puede ver en la reapertura de una aplicación posterior de esta manera.
Este código para swift 4. Agregar en didFinishLaunchingWithOptions()
:
NSSetUncaughtExceptionHandler { exception in
print("Error Handling: ", exception)
print("Error Handling callStackSymbols: ", exception.callStackSymbols)
UserDefaults.standard.set(exception.callStackSymbols, forKey: "ExceptionHandler")
UserDefaults.standard.synchronize()
}
Y el código se agrega en fistViewController viewLoad()
// ERROR ExceptionHandler
if let exception = UserDefaults.standard.object(forKey: "ExceptionHandler") as? [String] {
print("Error was occured on previous session! /n", exception, "/n/n-------------------------")
var exceptions = ""
for e in exception {
exceptions = exceptions + e + "/n"
}
AlertFunctions.messageType.showYesNoAlert("Error was occured on previous session!", bodyMessage: exceptions, {
}, no: {
UserDefaults.standard.removeObject(forKey: "ExceptionHandler")
UserDefaults.standard.synchronize()
})
}
EDITAR: El código de trabajo. Pero necesita volver a abrir su aplicación después de un error.