iOS 5.0 игнорирует NSSetUncaughtExceptionHandler? - PullRequest
3 голосов
/ 16 октября 2011

Я заметил странное поведение в iOS 5: NSSetUncaughtExceptionHandler (), похоже, больше ничего не делает.

У меня есть следующий код:

static NSString* documentsDirectory()
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

static void handleException(NSException *exception)
{
    // Write something to the documents dir
    NSString* path = [documentsDirectory() stringByAppendingPathComponent:@"crashlog.txt"];
    NSString* str = @"Handled exception";
    NSError* err;
    if(![str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&err])
    {
        NSLog(@"Failed to write to file");
    }
    NSLog(@"Handled exception");
}


@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSSetUncaughtExceptionHandler(&handleException);
    [NSException raise:@"Test" format:@"Testing"];

    ...
}

Код вышеработает на любом устройстве или симуляторе под управлением 4.x или ранее.Однако, когда я запускаю его на симуляторе 5.0, обработчик исключений не вызывается (не записывает файл в каталог документов, не регистрирует и не запускает, если я устанавливаю точку останова внутри обработчика).

К сожалению, у меня нет устройства 5.0, доступного для тестирования, поэтому я надеюсь, что кто-то может подтвердить, что оно не работает на 5.0, чтобы я мог отправить отчет об ошибке (или исправить меня, если есть проблема).с моим кодом).

Ответы [ 2 ]

2 голосов
/ 09 октября 2012

Используйте iOS 6.0 SDK, соберите и запустите его на симуляторе 5.0!Работает!

////// Код:

static NSString* documentsDirectory()
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

static void handleException(NSException *exception)
{
    // Write something to the documents dir
    NSString* path = [documentsDirectory() stringByAppendingPathComponent:@"crashlog.txt"];
    NSString* str = @"Handled exception";
    NSError* err;
    if(![str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&err])
    {
        NSLog(@"Failed to write to file");
    }
    NSLog(@"Handled exception");
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSSetUncaughtExceptionHandler(&handleException);
    [NSException raise:@"Test" format:@"Testing"];

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[NSSetUncaughtExceptionHandlerTestViewController alloc] initWithNibName:@"NSSetUncaughtExceptionHandlerTestViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

////// Журнал терминала:

2012-10-09 20:06:24.726 NSSetUncaughtExceptionHandlerTest[7815:c07] Handled exception
2012-10-09 20:06:24.727 NSSetUncaughtExceptionHandlerTest[7815:c07] *** Terminating app due to uncaught exception 'Test', reason: 'Testing'
*** First throw call stack:
(0x14a4052 0xea4d0a 0x144ca78 0x144c9e9 0x29d7 0x129d6 0x138a6 0x22743 0x231f8 0x16aa9 0x138efa9 0x14781c5 0x13dd022 0x13db90a 0x13dadb4 0x13daccb 0x132a7 0x14a9b 0x28b2 0x27e5)
terminate called throwing an exception(lldb) 
0 голосов
/ 01 декабря 2011

Я вижу то же самое. Это работает на моем iPad, но не в симуляторе. Если кто-то подтвердит это по телефону, отредактируйте этот ответ, чтобы отразить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...