我正在开发一款iOS应用程序,最近它的C++基础变得很大。C++不是我的强项,我对异常感到沮丧。我正在寻找一种方法,可以获得到抛出异常的现场堆栈跟踪信息(未处理的)异常。我会说,“未处理”的限定词是可选的; 作为最后手段,我可以断点任何异常抛出,尽管未处理的异常是理想的。
目前我得到的信息是无用的。假设我在调用栈上没有适当的异常处理程序,并且我执行以下操作:
该应用程序在
我想避免的是不得不为每次可能抛出异常的调用都包装一个try/catch块,只是为了获得堆栈跟踪以找到错误。在运行时,我确实不感兴趣捕获这些异常。当它们发生时,意味着程序执行存在致命缺陷,无法正常继续。我只想被通知,以便可以确定原因并修复问题,以便不再出现。
在Objective C中,我可以在
我意识到这种行为实际上只有在两种语言之间的异常处理上存在哲学差异时才有用。Objective C异常仅用于表示不可恢复的错误。例行错误处理任务通过错误返回代码完成。这意味着任何Objective C异常都是开发人员断点的绝佳选择。
C++似乎对异常具有不同的用途。它们用于处理致命错误和一般错误(至少在我使用的第三方库中是这样)。这意味着我可能不会真的希望在C++中抛出的每个异常都进行断点,但如果我无法只在未处理的异常上断点,我仍然认为这种能力很有用。
目前我得到的信息是无用的。假设我在调用栈上没有适当的异常处理程序,并且我执行以下操作:
std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range
该应用程序在
main()
中崩溃,并出现一条日志消息,显示“terminate called throwing an exception.” 毫无意义。将通用的try/catch块放在调用栈较高的位置也没有帮助,因为在异常处理期间,调用栈会向上展开到catch块的点,使我无法知道异常的实际起源。这也适用于提供自己的terminate_handler
。断言更有用,但它们要求我在某种程度上预期错误条件,而这并非总是可行。即使意外异常通过了我的预防性assert()
,我仍希望调试器能够步入调试。我想避免的是不得不为每次可能抛出异常的调用都包装一个try/catch块,只是为了获得堆栈跟踪以找到错误。在运行时,我确实不感兴趣捕获这些异常。当它们发生时,意味着程序执行存在致命缺陷,无法正常继续。我只想被通知,以便可以确定原因并修复问题,以便不再出现。
在Objective C中,我可以在
objc_exception_throw
上设置符号断点,任何时候如果我犯了错误,就会立即中断执行,并显示一个漂亮的堆栈跟踪,以便我知道问题所在。非常有用。我意识到这种行为实际上只有在两种语言之间的异常处理上存在哲学差异时才有用。Objective C异常仅用于表示不可恢复的错误。例行错误处理任务通过错误返回代码完成。这意味着任何Objective C异常都是开发人员断点的绝佳选择。
C++似乎对异常具有不同的用途。它们用于处理致命错误和一般错误(至少在我使用的第三方库中是这样)。这意味着我可能不会真的希望在C++中抛出的每个异常都进行断点,但如果我无法只在未处理的异常上断点,我仍然认为这种能力很有用。