4

我看到这篇关于检测 VMWare 或 Virtual PC
http://www.codeproject.com/KB/system/VmDetect.aspx
的文章 ,我看到他们使用了某种 try-except 语句。
所以我在 MSDN 中查找了它:http: //msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx

而且我不明白为什么要使用 try-except 而不是旧的 try-catch。它只是给我有关异常的其他信息吗?
如果是这样,当我使用随附文章中的代码时,我可以使用 try-catch,对吗?
谢谢 :)

4

5 回答 5

6

__try/__except try/ catch,用于不同类型的异常。您可以捕获硬件异常,例如浮点违规、错误的指针取消引用等,而不是 C++ 异常。这被称为结构化异常处理,或 SEH,如果您知道在哪里查找,MSDN 有相当多的内容。

在这种情况下,他们使用它来检测无效指令。这是他们尝试执行 x86 不支持的指令的地方,虚拟机使用它们。如果你在一个真实的 CPU 上运行,那么你会得到一个无效指令异常,如果你在一个虚拟机上运行,​​你就跟它说话了。

于 2011-07-06T17:32:31.327 回答
2

MSDN 通常对所有这些都不清楚,但是__try/处理的异常__except不是 C++ 异常,而是系统异常。诸如分段错误之类的事情。

于 2011-07-06T17:29:41.327 回答
2

__try__except结构化异常处理的一部分,这是一种与标准异常处理模型不同的异常处理模型,因为它处理硬件异常与软件异常相同,请参阅链接以获取信息。

于 2011-07-06T17:34:26.437 回答
1

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

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

对于使用,只需使用 try/catch 处理任何异常。如果有人明确向您抛出 SEH 异常(除以零、空指针取消引用等),请捕获它并尽快将其转换为常规程序流,例如使其成为常规异常或停止软件。

于 2011-07-06T17:34:41.890 回答
1

和子句用于结构化异常处理__try,这是一种针对 Windows 抛出的异常的异常处理机制。它们与 C++ 异常不同。__except__finally

于 2011-07-06T17:36:16.403 回答