Question

J'utilise le code suivant pour capturer des exceptions dans mon application:

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

Je me demandais si je peux pin-point, les numéros de ligne, UIView, classes, etc que l'erreur qui se produit sur.Idéalement, je voudrais des renseignements aussi détaillés que je peux obtenir, depuis qu'il est capturé par FlurryAPI google analytics.

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

Était-ce utile?

La solution

J'ai fini par aller avec ceci:

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

Mise à JOUR (basé sur @TommyG de commentaire ci-dessous):

Ajouter NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); à la fin de votre -(BOOL)application:didFinishLaunchingWithOptions: méthode AppDelegate.Ajoutez ensuite la méthode ci-dessus pour le AppDelegate ainsi.

Autres conseils

Vous pouvez faire parti de la précompilateur et écrire une macro qui rassemble toutes les valeurs, par exemple:

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

Toutefois, cela ne fonctionne que si vous jetez une exception à la règle et à l'intérieur d'un ObjC fonction (auto et _cmd sont les premiers paramètres que vous obtenez dans un ObjC fonction, où l'auto est un code qui pointe vers la classe et _cmd le sélecteur peut être (actuellement!) typecasted à const char).

Toutefois, si vous souhaitez seulement pour la Fondation des exceptions, vous avez deux options:

  1. Envelopper tout ce qui peut lever une exception dans @essayer() @catch() bloque et ensuite lancer une nouvelle custom, une exception
  2. Obtenir la trace de la pile, c'est ce qui pourrait être un peu plus dur que votre application est possible dans un état incohérent et ne peut pas rassembler toutes les valeurs.La collecte de l'état courant de la pile est couvert ici dans le détail.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top