每个C ++开发人员都应该知道有关结构化例外的重要观点?

有帮助吗?

解决方案

它们是相当于UNIX信号的WIN32,让您捕获CPU例外,例如违规,非法指导,除以零。

使用正确的编译器选项(用于Visual C ++的/EHA),C ++异常使用与堆栈放松的相同机制适用于C ++(用户)异常和SEH(OS)异常。

与C ++异常不同,SEH未键入,但所有人共享具有异常代码(原因)的相同数据结构,以及有关什么代码错误以及CPU寄存器在故障时持有的内容的其他信息。看 GetExceptionCodeGetExceptionInformation 有关此的更多详细信息。

另外,SEH具有“第一级”处理,可让您记录或以其他方式处理异常 放松摧毁所有局部变量。

其他提示

我最近遇到了一个间接引起的问题,特别是因为SEH的一个特征,我认为每个开发人员都应该意识到:

当未调用SEH使用SEH时,因此,如果您的损坏器中有清理代码,则不会清理。

我们的问题是由一个关键部分引起的,该部分是由锁定器中锁定并在毁灭仪中解锁的对象包裹的。

我们有一个僵局的情况,无法弄清楚为什么,经过大约一周的挖掘代码和转储和调试,我们终于明白这是因为有一个例外是由com处理的,并导致关键部分保持锁定。 。我们更改了项目属性中VS中的汇编标志,该标志即使在SEH上也可以运行驱动器,并解决了问题。

因此,即使您可能不会在代码中使用SEH,您也可能会使用(例如COM)且可能导致意外行为的库。

他们应该知道它们不是标准C ++的一部分 - 它们是Microsoft发明,可以用C ++以外的其他语言使用。

Win32™结构化异常处理深处的速成课程

那篇文章是 引用SEH加快速度的参考。 13年后,仍然是最好的。

在MSDN上有一个专门的主题 SEH与C ++异常处理差异.

C ++开发人员应该知道是否正在讨论SEH的某些事情:

写C/C ++ SEH 例外处理程序:

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

这是 不是 C ++异常处理是MS特异性扩展,用于钩住直线INOT SEH。它的工作原理与您的C ++例外情况大不相同。您需要对SEH有一个很好的了解才能使用这些。

写C/C ++ SEH 终止处理程序:

__try {
   // guarded code
}
__finally ( expression ) {
   // termination code
}

与SEH处理程序相同,不要将其与C ++异常语义混淆。您需要对SEH有很好的了解。

_set_se_trasnlator: :这是在使用异步异常时将SEH异常转换为C ++类型异常的函数 /eha.

最后,个人意见:C ++开发人员应该知道SEH吗?第一个新秀之后 .ecxr 您会知道,当推动推动C ++时,只是为了方便起见而提供的幻觉。唯一发生的事情是SEH。

一个重要的一点是知道何时使用SEH以及何时使用标准C ++异常。首先,仅选择一个系统 - 混合系统往往是有问题的,需要对两者进行深入了解才能很好地实施。其次,在高水平上,SEH不限于C ++,而标准C ++例外不限于Windows。如果这不决定您的决定,请选择标准例外,除非它们不足(请参阅其他答案,以获取有关SEH可以做什么的更多详细信息)。

来自 微软的文档 (日期为2018年8月13日)支持这一结论。

结构化异常处理(SEH)是C的Microsoft扩展,以优雅地处理某些异常代码情况,例如硬件故障。尽管Windows和Microsoft C ++支持SEH,但我们建议您使用ISO-标准C ++异常处理,因为它使您的代码更便于便携式和灵活。但是,要维护现有代码或特定类型的程序,您仍然可能必须使用SEH。

为什么扩展的作者建议在大多数情况下不使用它?大概是因为该扩展名是为C编写的,并且当前上下文为C ++。这些语言是相似的,因此将SEH移植到C ++作为副效力可能很容易,即使只有“特定类型的程序”才能真正受益。 (或可能是其他一些原因;也许移植是在C ++标准化之前开始的。历史记录。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top