我应该了解C ++中的结构化exception(SEH)?
每个C ++开发者都应该知道结构化exception有哪些重要的一点?
它们是与Unix信号相当的Win32,并且可以捕获访问冲突,非法指令,除以零等CPUexception。
使用正确的编译器选项(Visual C ++的/ EHa),C ++exception使用与堆栈展开适用于C ++(用户)exception和SEH(OS)exception相同的机制。
与C ++exception不同,SEH不是键入的,而是共享具有exception代码(原因)的相同数据结构以及有关哪些代码故障以及故障发生时CPU寄存器保存的附加信息。 有关更多详细信息,请参阅GetExceptionCode
和GetExceptionInformation
。
此外,SEH具有“一次机会”处理,允许您在展开销毁所有局部variables之前logging或以其他方式处理exception。
我最近有一个问题是由SEH间接造成的,具体是因为SEH的一个特点,我想每个开发者都应该知道:
当使用SEH时,不会调用析构函数,所以如果在析构函数中有清除代码,它将不会被清理。
我们的问题是由构造函数中的Lock和析构函数中的Unlock包含的关键部分引起的。
我们有一个死锁的情况,不知道为什么,经过大约一个星期的挖掘代码和转储和debugging,我们终于明白这是因为有一个exception,由COM处理,导致临界区保持locking。 我们在项目属性中更改了VS中的编译标志,告诉它甚至对SEH运行析构函数,并解决了这个问题。
所以即使你不能在你的代码中使用SEH,你可能会使用一个像COM一样的库,这可能会导致意外的行为。
他们应该知道他们不是标准C ++的一部分 – 他们是微软的发明,可以用于C ++以外的语言。
Win32™结构化exception处理深度课程
那篇文章是对 SEH加速的参考。 13年后,仍然是最好的。
在MSDN上有一个SEH专用主题与C ++exception处理差异 。
如果正在讨论SEH,C ++开发者应该知道的一些事情是:
编写C / C ++ SEH exception处理程序 :
__try { // guarded code } __except ( expression ) { // exception handler code }
这不是 C ++exception处理,是直接连接SEH的MS特定扩展。 它与你的普通C ++exception非常不同。 你需要很好的理解SEH才能使用这些。
编写C / C ++ SEH 终止处理程序 :
__try { // guarded code } __finally ( expression ) { // termination code }
与SEH处理程序相同,请不要将其与C ++exception语义相混淆。 你需要很好的理解SEH。
_set_se_trasnlator
:这是在使用asynchronousexception/ EHa时将SEHexception转换为C ++typesexception的函数 。
最后是个人观点:C ++开发者应该知道SEH吗? 在你的第一个菜鸟.ecxr之后,你就会明白,当推动推C ++exception只是为了方便而提供的幻想。 唯一要做的就是SEH。
- 我怎样才能在PHP中处理file_get_contents()函数的警告?
- 获取exception“IllegalStateException:不能执行此操作后onSaveInstanceState”
- Kill(),Environment.Exit(0)或this.Shutdown()
- WCF ExceptionShielding错误ID不匹配与handlingInstanceId传递给处理程序
- 如何实现C ++exception处理运行时?
- android查看不附加到窗口pipe理器
- 什么时候应该使用noexcept?
- 检查在Python中打开了哪些文件
- 真实世界Haskell的哪些部分现在已经过时或被认为是不好的做法?