9

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

有什么方法可以捕获未捕获的异常并及时执行代码将异常保存到日志文件中?目前,Log 类只是每隔一段时间就写入文件,在写入失败的情况下在两个文件之间交替等。这工作正常,但如果它可以看到发生未处理的异常,写入任何未写入的日志,那就太好了记录到文件中,注意发生了异常并记录其详细信息,然后允许应用程序崩溃。

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

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

如果有人能给我关于这是否可能的见解或建议,将不胜感激。

4

3 回答 3

18

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

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

在 AppDelegate 中将其引用didFinishLaunchingWithOptions为:

NSSetUncaughtExceptionHandler(&HandleExceptions);
于 2013-03-11T21:30:25.610 回答
3

您可以通过调用设置自己的异常处理程序NSSetUncaughtExceptionHandler()

你可以称它为你的应用程序委托

- (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]);
}
于 2013-03-11T21:31:19.593 回答
1

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

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

- (void)mExceptionHandler(NSException *exception) {
    NSLog(@"Exception %@", exception);
}
于 2013-03-11T21:31:55.453 回答