2011-07-06 58 views
4

我碰到這篇文章是約檢測VMware或虛擬PC
http://www.codeproject.com/KB/system/VmDetect.aspx
,我看到他們使用某種嘗試,除了陳述。
所以我在MSDN中查找:http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspxC++的try-except語句

我不明白爲什麼我會用try-except而不是舊的try-catch。 它只是給我關於例外的額外信息?
如果是這樣,當我使用附加文章中的代碼時,我可以使用try-catch,對嗎?
謝謝:)

+1

[Visual C++ Exception FAQ](http://members.cox.net/doug_web/eh.htm)可能會有幫助。特別是Q3。 – Darcara

回答

6

__try/__except一個try/catch,對於不同類型的異常。您可以捕獲硬件異常,如浮點違例,錯誤的指針去引用等,而不是C++異常。這被稱爲結構化異常處理(SEH),如果你知道在哪裏尋找,MSDN有很多。

在這種情況下,他們正在使用它來檢測無效指令。這是他們嘗試執行x86不支持的指令的地方,而虛擬機使用它們。如果你在一個真正的CPU上運行,那麼你將得到一個無效的指令異常,如果你在虛擬機上運行,​​你只是跟它說話。

+0

好的,所以我明白答案是「我可以使用try-catch而不是try-except」是否? :) – Idov

+0

@Idov:當然。他們是根本不同的系統。 – Puppy

2

MSDN通常不清楚這一切,但__try/__except處理的例外是不是C++異常,但系統例外。像分段錯誤。

2

__try__exceptstructured exception handling一部分,這比標準的一個不同的異常處理模型,因爲它處理硬件異常相同軟件的人,看到該鏈接的信息。

1

在實際的C++標準開始包含異常之前,Microsoft爲Microsoft C++創建了結構化異常處理。因此,在Windows上,所有存在的異常都是SEH異常,但並非所有異常都是C++異常。

__try/__except是一種捕捉SEH異常(以及偶然也是C++異常)的方法。 try/catch是僅捕獲C++異常的方法。我還記得,在一個函數中不能使用這兩個函數是有限制的,但是很容易解決這個問題。

對於使用,只需使用try/catch作爲例外。如果有人明確地拋出一個SEH異常(除以零,空指針解引用等),抓住它並儘快將其轉換爲常規程序流,例如使其成爲常規異常或停止軟件。