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

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.