Objective-C/iPhone - NSException capturar tanta información como sea posible
-
14-11-2019 - |
Pregunta
Estoy usando el siguiente código para capturar excepciones en mi app:
void uncaughtExceptionHandler(NSException *exception) {
[FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}
Sólo me preguntaba si puedo pin-punto, números de línea, UIView
, clases, etc, ya que el error que ocurre en.Idealmente me gustaría tanta información detallada como lo puedo conseguir, ya que es capturado por FlurryAPI
analytics.
FlurryAPI:http://www.flurry.com/
Solución
Terminé yendo con esto:
void uncaughtExceptionHandler(NSException *exception) {
NSArray *backtrace = [exception callStackSymbols];
NSString *platform = [[UIDevice currentDevice] platform];
NSString *version = [[UIDevice currentDevice] systemVersion];
NSString *message = [NSString stringWithFormat:@"Device: %@. OS: %@. Backtrace:\n%@",
platform,
version,
backtrace];
[FlurryAPI logError:@"Uncaught" message:message exception:exception];
}
ACTUALIZACIÓN (basado en @TommyG comentario de abajo):
Agregar NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
al final de su - -(BOOL)application:didFinishLaunchingWithOptions:
método en AppDelegate
.A continuación, agregue el método anterior para la AppDelegate
así.
Otros consejos
Usted puede tomar ventaja de la precompilador y escribir una macro que reúne todos los valores, por ejemplo:
#define __ThrowException(name, reason, class, function, file, line, info) [NSException exceptionWithName:name reason:[NSString stringWithFormat:@"%s:%i (%@:%s) %@", file, line, class, function, reason] userInfo:info];
#define ThrowException(name, reason, info) __ThrowException(name, reason, [self class], _cmd, __FILE__, __LINE__, info)
Sin embargo, esto sólo funciona cuando se lanza una excepción y desde el interior de un ObjC función (auto y _cmd
son los primeros parámetros que usted recibe en un ObjC función, donde el auto es un identificador que apunta a la clase y _cmd
para el selector, el cual puede ser (en la actualidad!) typecasted a const char).
Sin embargo, si usted desea esto sólo para la Fundación excepciones, usted tiene dos opciones:
- Envolver todo lo que podría lanzar una excepción en @intentar() @catch() se bloquea y luego lanzar una nueva, la costumbre, la excepción
- Obtener la traza de la pila, esto es lo que podría ser un poco más difícil a medida que la aplicación es posible en un estado inconsistente, y no se puede reunir a todos los valores.La recopilación de la actual traza de la pila está cubierto aquí en gran detalle.