Objective-C / iPhone - NSException собирает как можно больше информации - PullRequest
9 голосов
/ 31 марта 2011

Я использую следующий код для захвата исключений в моем приложении:

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

Просто интересно, могу ли я точно указать, номера строк, UIView, классы и т. Д., На которых происходит ошибка. В идеале я хотел бы получить как можно больше подробной информации, поскольку она захвачена аналитикой FlurryAPI.

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

Ответы [ 2 ]

16 голосов
/ 02 апреля 2011

Я закончил с этим:

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

ОБНОВЛЕНИЕ (на основе комментария @ TommyG ниже):

Добавьте NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); в конец вашего метода - -(BOOL)application:didFinishLaunchingWithOptions: в AppDelegate. Затем добавьте вышеуказанный метод к AppDelegate.

3 голосов
/ 31 марта 2011

Вы можете воспользоваться прекомпилятором и написать макрос, который собирает все значения, например:

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

Однако это работает только тогда, когда вы генерируете исключение и изнутри функции ObjC (self и_cmd - это самые первые параметры, которые вы получаете в функции ObjC, где self - это идентификатор, указывающий на класс, и _cmd на селектор, который может (в настоящее время!) Быть приведен к const char).

Однако, если вы хотите это только для исключений Foundation, у вас есть два варианта:

  1. Обернуть все, что может вызвать исключение в блоках @try () @catch (), а затем создать новый, пользовательский, исключение
  2. Получите трассировку стека, это может быть немного сложнее, так как ваше приложение находится в несовместимом состоянии и не может собрать все значения.Сбор текущей трассировки стека подробно описан здесь .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...