【问题标题】:Is there any way to execute code after an uncaught exception in iOS? [duplicate]在 iOS 中发生未捕获的异常后,有什么方法可以执行代码? [复制]
【发布时间】:2013-02-27 05:50:36
【问题描述】:

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

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

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

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

如果有人可以就这是否可行给我见解或建议,将不胜感激。

【问题讨论】:

  • @try { } @catch(NSException *ex) { } 来救援。或者可能是NSException 上的一些方法?
  • NSSetUncaughtExceptionHandler(虽然它不是很可靠)。
  • here

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以通过调用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]);
    }
    

    【讨论】:

      【解决方案3】:

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

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

      在 AppDelegate didFinishLaunchingWithOptions 中将其引用为:

      NSSetUncaughtExceptionHandler(&HandleExceptions);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 2021-12-26
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多