Pergunta

Eu estou usando o seguinte código para capturar exceções em meu aplicativo:

void uncaughtExceptionHandler(NSException *exception) {
    [FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}

Basta saber se eu posso ponto de pin, números de linha, UIView, aulas, etc., que o erro está ocorrendo.Idealmente, eu gostaria de tantas informações detalhadas de como eu posso obter, uma vez que é capturado por FlurryAPI o google analytics.

FlurryAPI:http://www.flurry.com/

Foi útil?

Solução

Acabei indo com este:

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];
}

ATUALIZAÇÃO (baseada no @TommyG do comentário abaixo):

Adicionar NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); ao final do seu - -(BOOL)application:didFinishLaunchingWithOptions: método em AppDelegate.Em seguida, adicione o método acima para o AppDelegate bem.

Outras dicas

Você pode tirar vantagem do pré-compilador e escreva uma macro que reúne todos os valores, como por exemplo:

#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)

No entanto, isso só funciona quando você lançar uma exceção dentro de um ObjC função (auto e _cmd são os primeiros parâmetros de você entrar em um ObjC função, onde o self é uma identificação que aponta para a classe e _cmd para o seletor que pode ser (atualmente!) typecasted para const char).

No entanto, se você quiser apenas para Fundação exceções, você tem duas opções:

  1. Enrole tudo o que pode lançar uma exceção no @tentar() @pegar() blocos e, em seguida, lançar um novo e personalizado, com exceção
  2. Obter o rastreamento da pilha, isto é o que pode ser um pouco mais rígido que o aplicativo é possível em um estado inconsistente e não pode reunir todos os valores.Recolha o atual rastreamento de pilha é coberto aqui em grande detalhe.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top