2011-07-06 2 views
4

私は
http://www.codeproject.com/KB/system/VmDetect.aspx
VMWareのまたはVirtual PCを検出に関するこの記事に出くわしたと私は、彼らがしよう-以外の文のいくつかの種類を使用することがわかりました。
だから私はMSDNでそれを見上げ:http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspxはC++試す-以外の文

と私は試し-除く代わりに、古き良きの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++の例外をキャッチすることはできません。これはStructured Exception Handling(SEH)と呼ばれ、どこを見なければならないか分かっていればMSDNにはかなりのものがあります。

この場合、不正な命令を検出するために使用されています。ここでは、x86がサポートしていない命令を実行しようとしており、仮想マシンはそれらを使用します。実際のCPUで実行している場合、無効な命令例外が発生し、仮想マシン上で実行している場合は、その命令と話しただけです。

+0

大丈夫ですので、「try-exceptの代わりにtry-catchを使用できますか?」という答えはNOですか? :) – Idov

+0

@アイドゥーヴ:確かに。それらは根本的に異なるシステムです。 – Puppy

2

MSDNは、一般的に、このすべてについては不明であるが、__try/__exceptによって対処例外はC++の例外が、システム例外ではありません。セグメンテーションフォルトのようなもの

2

__tryおよび__exceptは、structured exception handlingの一部です。これは、ソフトウェア例外と同じようにハードウェア例外を処理するため、標準の例外処理モデルとは異なる例外処理モデルです(情報のリンクを参照)。

1

Microsoftは、実際のC++標準にも例外を含める前に、Microsoft C++用の構造化例外処理を作成しました。したがって、Windowsでは、存在するすべての例外はSEH例外ですが、それらのすべてがC++例外ではありません。

__try/__exceptは、SEH例外(および偶然にもC++例外)を捕まえる方法です。 try/catchはC++の例外だけをキャッチする方法です。一つの関数で両方を使うことができないという限界があることを思い出しますが、それを回避するのは簡単です。

使用するには、例外に対してtry/catchを使用してください。誰かが明示的にSEH例外(ゼロで割ったり、ヌルポインタ参照解除など)をスローした場合、それをキャッチして通常のプログラムフローに変換してください。通常の例外処理やソフトウェアの停止などです。

1

__try__except__finally句はStructured Exception Handlingためのもので、これは、Windowsによってスローされた例外のための例外処理メカニズムです。それらはC++例外と同じではありません。

関連する問題