c ++ try-except语句

时间:2011-07-06 17:27:28

标签: c++ windows try-catch try-except

我遇到了关于检测VMWare或Virtual PC的文章 http://www.codeproject.com/KB/system/VmDetect.aspx
我看到他们使用某种尝试 - 除外的陈述 所以我在MSDN中查找了它:http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx

我不明白为什么我会使用try-except而不是旧的try-catch。 它只是给我关于例外的其他信息吗? 如果是这样,当我使用附件中的代码时,我可以使用try-catch,对吧? 谢谢:))

5 个答案:

答案 0 :(得分:6)

对于不同类型的例外,

__try / __except try / catch。您可以捕获硬件异常,如浮点违规,错误指针取消引用等,而不是C ++异常。这被称为结构化异常处理(SEH),如果你知道在哪里看,MSDN就会有很多。

在这种情况下,他们使用它来检测无效指令。这是他们尝试执行x86不支持的指令,虚拟机使用它们的地方。如果你在一个真正的CPU上运行,那么你将得到一个无效的指令异常,如果你在虚拟机上运行,​​你刚刚与它交谈。

答案 1 :(得分:2)

MSDN通常不清楚所有这些,但__try / __except处理的异常不是C ++异常,而是系统异常。比如Segmentation Fault。

答案 2 :(得分:2)

__try__exceptstructured exception handling的一部分,这是一个与标准异常处理模型不同的异常处理模型,因为它处理与软件异常相同的硬件异常,请参阅链接信息。

答案 3 :(得分:1)

Microsoft在实际C ++标准开始包含异常之前为Microsoft C ++创建了结构化异常处理。因此,在Windows上,存在的所有异常都是SEH异常,但并非所有异常都是C ++异常。

__ try / __except是一种捕获SEH异常的方法(并且意外地,也是C ++异常)。 try / catch是仅捕获C ++异常的方法。我还记得,在一个功能中无法使用这两个功能是有限制的,但是很容易解决这个问题。

使用时,只需使用try / catch进行任何异常。如果某人明确地抛出了一个SEH异常(除以零,空指针取消引用等),请抓住它并将其转换为常规程序流asap,例如将其变为常规异常或暂停软件。

答案 4 :(得分:1)

__try__except__finally子句适用于Structured Exception Handling,这是Windows抛出异常的异常处理机制。它们与C ++异常不同。