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/

¿Fue útil?

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:

  1. 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
  2. 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top