Objective-C/iPhone - NSException capturar o máximo de informação possível
-
14-11-2019 - |
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/
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:
- 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
- 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.