gpt4 book ai didi

ios - 自定义 NSUncaughtExceptionHandler 调用先前的异常处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:57:17 31 4
gpt4 key购买 nike

我的应用程序包含使用 NSSetUncaughtExceptionHandler 来捕获崩溃的崩溃报告库。我需要在崩溃报告实现之前/之后实现自定义操作(记录崩溃并显示警报 View )。为实现此行为,首先我使用 NSGetUncaughtExceptionHandler() 保留对先前 UncaughtExceptionHandler 的引用,然后注册我的自定义异常处理程序和信号处理程序。在我的自定义处理程序中,我尝试在我的自定义操作之前/之后执行之前的处理程序,但这会为 previousHandler(exception) 抛出一个信号 SIGABRT(在这两种情况下)。这是代码示例:

static NSUncaughtExceptionHandler *previousHandler;

void InstallUncaughtExceptionHandler()
{
// keep reference to previous handler
previousHandler = NSGetUncaughtExceptionHandler();

// register my custom exception handler
NSSetUncaughtExceptionHandler(&HandleException);
signal(SIGABRT, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGFPE, SignalHandler);
signal(SIGBUS, SignalHandler);
signal(SIGPIPE, SignalHandler);
}

void HandleException(NSException *exception)
{
// execute previous handler
previousHandler(exception);
// my custom actions
}

void SignalHandler(int signal)
{
NSLog(@"SignalHandler");
}
  1. 如何在不抛出信号的情况下执行之前的处理程序?
  2. 知道为什么当系统发出信号时 SignalHandler 没有被调用吗?

最佳答案

不要注册信号处理程序。我必须对下面显示的代码进行一些混淆,但它来自 App Store 上的生产应用程序:

AppDelegate 应用程序:didFinishLaunchingWithOptions:

fabricHandler = NSGetUncaughtExceptionHandler();
NSSetUncaughtExceptionHandler(&customUncaughtExceptionHandler);

处理程序:

void customUncaughtExceptionHandler(NSException *exception) {
// Custom handling

if (fabricHandler) {
fabricHandler(exception);
}
}

关于ios - 自定义 NSUncaughtExceptionHandler 调用先前的异常处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33473058/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com