我应该了解C ++中的结构化exception(SEH)?

每个C ++开发者都应该知道结构化exception有哪些重要的一点?

它们是与Unix信号相当的Win32,并且可以捕获访问冲突,非法指令,除以零等CPUexception。

使用正确的编译器选项(Visual C ++的/ EHa),C ++exception使用与堆栈展开适用于C ++(用户)exception和SEH(OS)exception相同的机制。

与C ++exception不同,SEH不是键入的,而是共享具有exception代码(原因)的相同数据结构以及有关哪些代码故障以及故障发生时CPU寄存器保存的附加信息。 有关更多详细信息,请参阅GetExceptionCodeGetExceptionInformation

此外,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。