Mat*_*ing 6 c++ xcode exception objective-c
我正在开发一个最近已经发展成为一个大型C++库的iOS应用程序.C++不是我的强项,我对异常感到沮丧.我正在寻找的是一种将堆栈跟踪到(未处理的)异常抛出的站点的方法.我会说"未处理"限定符是可选的; 尽管未处理的异常是理想的,但我会决定打破任何异常抛出作为最后的手段.
我目前得到的是没用的.假设我在callstack上面没有任何适当的异常处理程序,我会做类似的事情
std::vector<int> my_vector;
my_vector.at(40) = 2; // Throws std::out_of_range
Run Code Online (Sandbox Code Playgroud)
该应用程序将中断,main()我将收到一条日志消息,说"终止称为抛出异常".没用.
将通用try/catch块放在callstack的上方也无济于事,因为在异常处理期间,callstack在catch块的点处被解开,让我对实例的异常原点一无所知.这也适用于提供我自己的terminate_handler.断言更有用,但它们要求我在某种程度上预测错误条件,这是我不能总是这样做的.我仍然希望调试器能够介入,即使一个意外的异常使它超过我的先发制人assert().
我想要避免的是必须包装每个可能在try/catch块中抛出异常的调用,只是为了让堆栈跟踪错误.在运行时,我真的对捕获这些异常不感兴趣.当它们发生时,意味着程序执行中存在致命缺陷,并且它无法正常继续.我只是想得到通知,所以我可以确定原因并修复问题,这样就不会再发生了.
在Objective C中,我可以放置一个符号断点objc_exception_throw,任何时候我搞砸了一些东西我会立即中断执行并呈现一个很好的堆栈跟踪,所以我知道问题出在哪里.很有帮助.
我意识到这种行为实际上只是有用,因为两种语言之间的异常处理存在哲学上的差异.Objective C异常仅用于表示不可恢复的错误.常规错误处理的任务是通过错误返回码完成的.这意味着任何 Objective C异常都是开发人员断点的理想选择.
C++似乎对Exceptions有不同的用法.它们习惯于处理致命错误和常规错误(至少在我正在使用的第三方库中).这意味着我可能实际上并不想打破C++中抛出的每个异常,但如果我不能仅仅处理未处理的异常,我仍然会发现这个能力很有用.
您可以在Xcode中快速建立所有C++抛出条件的中断:
cmd+6std::out_of_range 更新
如果您有很多过滤器,您可能更愿意:
__cxa_throw(可能因std库而异)bt该bt命令记录回溯.以这种方式配置,它将自动继续.
因此,这将只记录每个抛出异常的回溯 - 当程序由于未处理的异常而终止时,线索将在最终记录的回溯中(通常是最后一个,除非库重新抛出).
| 归档时间: |
|
| 查看次数: |
1488 次 |
| 最近记录: |