在iOS中未捕获的异常后有没有办法执行代码?

时间:2013-03-11 21:26:39

标签: ios objective-c logging ios6 uncaught-exception

我一直致力于为多个应用程序实现多级日志记录的框架。它主要用于内部用于测试与其他设备通信的应用程序,但也用于我们将要分发的一些应用程序。

有没有办法捕获未捕获的异常并立即执行代码以将异常保存到日志文件中?目前,Log类只是经常写入文件,在写入失败的情况下在两个文件之间交替等等。这样可以正常工作,但是如果它可以看到发生未处理的异常,写入任何未写入的日志会很棒要记录的条目,请注意发生了异常并记录其详细信息,然后允许该应用程序崩溃。

如果有一些方法可以在应用程序范围内捕获未处理的异常,我会认为它会是这样的:

appDidReceiveUnhandledException:(NSException *)exception
{
    //write log to disk
    //append exception info to log file
    //rethrow exception
}

如果有人能够就这是否可能给我提供见解或建议,我们将不胜感激。

3 个答案:

答案 0 :(得分:17)

您可以在AppDelegate中添加应用程序范围的未处理异常处理程序:

void HandleExceptions(NSException *exception) {
    NSLog(@"The app has encountered an unhandled exception: %@", [exception debugDescription]);
    // Save application data on crash
}

在AppDelegate didFinishLaunchingWithOptions中将其引用为:

NSSetUncaughtExceptionHandler(&HandleExceptions);

答案 1 :(得分:3)

您可以通过调用NSSetUncaughtExceptionHandler()

来设置自己的异常处理程序

你可以称之为app delegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

#ifdef DEBUG
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
#endif

...

}

如您所见,您需要将函数指针传递给类似这样的函数:

void uncaughtExceptionHandler(NSException *exception)
{
    NSLog(@"App Crash:\n%@", exception);
    NSLog(@"Stack Trace:\n%@", [exception callStackSymbols]);
}

答案 2 :(得分:1)

您必须设置异常处理程序,最好在applicationDidFinishLaunching中的app委托中完成,即:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSSetUncaughtExceptionHandler(&mExceptionHandler);
}

- (void)mExceptionHandler(NSException *exception) {
    NSLog(@"Exception %@", exception);
}