我正在开发一个最近增长了大量C++基础的iOS应用程序。 C++并不是我的专长,而且我因例外而感到沮丧。我正在寻找的是一种获取堆栈跟踪到(未处理)异常抛出的站点的方法。我会说“未处理”限定符是可选的;我会打破任何异常抛出作为最后的手段,虽然未处理的例外是理想的。我可以获得未处理(目标)C++异常的堆栈跟踪吗?
我目前得到的是无用的。假设我没有任何相应的异常处理程序越往上调用堆栈,我这样做
std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range
应用程序将在main()
突破,我会得到一个日志消息说“终止称为抛出异常。”没有帮助。
将通用try/catch块放在callstack的上方也没有帮助,因为callstack在异常处理期间解除了catch块的位置,使得我不知道异常的实际来源。这也适用于提供我自己的terminate_handler
。断言更有用,但它们要求我在某种程度上预测错误情况,这是我不能总是这样做的。即使意外的异常超过了我的先发制人的assert()
s,我仍然希望调试器能够进入。
我想避免的是不得不将每个可能在try/catch块中引发异常的调用都包装起来,以便将堆栈跟踪发送到错误。在运行时,我真的不想捕捉这些异常。当它们发生时,这意味着程序执行中存在一个致命的缺陷,并且它无法正常继续。我只是想得到通知,所以我可以确定原因并修复问题,以免再次发生。
在Objective C,我可以把一个象征性的断点objc_exception_throw
,任何时候我拧的东西了,我会立即中断执行,并用一个漂亮的堆栈跟踪信息呈现,所以我知道在哪里的问题。很有帮助。
我意识到这种行为实际上只是有用的,因为两种语言之间异常处理的哲学差异。 Objective C异常仅用于表示不可恢复的错误。常规错误处理的任务是通过错误返回码完成的。这意味着任何客观的C异常是一个很好的开发人员断点的候选人。
C++似乎对Exceptions有不同的用处。它们用于处理致命错误和例行错误(至少在我正在使用的第三方库中)。这意味着我可能并不想在C++中抛出任何异常,但如果我不能仅在未处理的异常中分解,我仍然会发现该功能很有用。
C●汇编程序时
你可能有唯一的问题是++异常并不是真正用于_routine_错误,但它们有时会被滥用。确实,他们不仅仅是因为不可恢复的错误。 – bames53 2012-02-29 22:27:28