【问题标题】:Is it possible to get which class thrown the exception?是否有可能获得哪个类引发了异常?
【发布时间】:2014-03-24 10:41:50
【问题描述】:

是否有可能在运行时获取哪个类抛出了异常?

如果是,那该怎么做呢?

我想要做的是检测哪个类确实引发了异常。我正在使用 NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler *) 来检测我的应用程序是否崩溃。这样,我就有了 NSException,我想知道哪个类抛出了它。

另外,它不是用于调试目的。

#pragma mark - Exception Handler
void HandleException(NSException *exception)
{
    // Handle exception
}

void InstallUncaughtExceptionHandler()
{
    NSSetUncaughtExceptionHandler(&HandleException);

    //signal(SIGSYS, SIG_DFL);

    for(int x = 1; x <= 30; x++)
    {
        signal(x, SIG_DFL);    
    }
}

【问题讨论】:

  • 您在寻找布尔答案吗?如果是这样,那么答案是“是”。
  • @user3447428,谢谢!我更新了我的问题。基本上,我需要知道该怎么做。
  • @MarcoPace,谢谢,但我想做的是检测哪个类确实引发了异常。我正在使用 NSSetUncaughtExceptionHandler(NSUncaughtExceptionHandler *) 来检测我的应用程序是否崩溃。这样,我就有了 NSException,我想知道哪个类抛出它。
  • @dzep 查看我的代码并将其应用于设置的异常处理程序。

标签: ios objective-c nsexception


【解决方案1】:

您可以在异常处理程序中使用+callStackSymbols (NSException) 读取堆栈跟踪。最后的条目是系统调用。但在它下面你会找到投掷者。

@try
{
    …
}
@catch (NSException *e)
{
    NSLog( @"%@", [e callStackSymbols] );
}

【讨论】:

  • 谢谢!是的,我们可以使用callStackSymbols 阅读它。而且我们知道提交的应用程序 (.ipa) 在运行时不会对其进行符号化。所以,如果我们得到了调用堆栈,我们仍然不知道哪个类抛出了异常。如果只有 iTunes 崩溃日志有 REASON 信息。
  • 哦,我以为是调试用的。
  • 但是可以看到返回地址吗? (我现在无法对其进行测试。)因此您可以遍历类及其方法的实现指针并找到匹配项。 (是的,您必须进行边界检查。)一方面听起来很难看,另一方面,如果有异常,您有足够的时间去做。这对你有用吗?我从来没有尝试过,但考虑到它过去面临一个问题。
【解决方案2】:

您无法控制断点触发的位置。但是,一旦您遇到断点,就可以使用 bt 命令打印当前堆栈跟踪。

来自link 的非常好的答案。

【讨论】:

  • 由于网速慢才看到他的评论。
【解决方案3】:

只需转到 Xcode 左侧面板上的断点点击窗格。 按该面板右下角的“+”按钮。 单击“添加异常断点”。 您的应用程序将引发的每个异常,一个断点将自动停止执行,您可以看到该异常在您的代码中的位置!

【讨论】:

    猜你喜欢
    • 2011-01-27
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多