2016-10-13 2 views
2

私は、 の__try/__exceptブロックでヘルプを使ってWindowsの例外処理を実現しようとしています。プログラムが__exceptブロックに入っていない

問題は、プログラムが__exceptというブロックを入力することがなく、誤って終了するという問題です。

作業領域: OS:Windows 7 x64;フレームワーク:Embarcadero XE5 C++ Builder; アプリケーションテンプレートの種類:コンソール64ビットアプリケーション(32ビットが正常に動作するために!)

コード:

void foo() 
{ 
    __try 
    { 
    int *p = 0; 
    fprintf(stderr, "before action"); 
    *p = 1; 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) 
    { 
    printf("in __except block\n"); 
    throw(""); 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
try 
{ 
    foo(); 
} 
catch(...) 
{ 
    printf("in catch block\n"); 
} 

printf("end of main\n"); 
return 0; 
} 

出力:では

before action 

その後、間違って終了

私は例外ハンドラをこのように追加しました:

私はこの出力を得た。この後

出力:

before action 
in excepiton filter 

その後、間違って終了

プログラムはexceptブロック__入っていないのはなぜ? 例外ハンドラに入った後でも正しく動作する方法はありますか? * p = 1;

+1

'__except'を使いたい場合は' __try'を使うべきではありませんか? – SingerOfTheFall

+1

興味深いことに、それはコンパイルすることもできます。コンパイラのバーフィングなしで混在して一致させることができれば、非常に優れたMS拡張ではありません。 – UKMonkey

+0

@SingerOfTheFall試してみました - うまくいきません:) – Sas

答えて

2
  1. * p = 1;スローされません...あなたが望むものは "throw std :: Exception()"です
  2. 投げは比較的高価ですSee hereだから{try {} catch {throw}} catch {}が悪いです。ちょうど1回のキャッチが必要です
  3. (意見)ポータブルなものにこだわる - 試してみてください。 MSは外見でこれを追加したので、最終的にはJavaのようにできました。それは

例外ハンドラを入力した後、正常に機能し続けるための方法はありをコンパイルしていないなぜあなたは__try __catchを使用する場合には、これらを使用して始めましょうとあなたがLinux上で何かを書くために持っているとき、あなたは不思議に思うでしょうか?

あなたのプログラムが意味することは、例外によって異なります。唯一の提案は命名に従うことです - 例外は例外的です。読み込みがブロックされる可能性があります。その場合、ちょうど座ってもっと待つことができます - または、DLLが読み込まれず、アプリケーションによって必要とされた可能性があります。回復します。

+0

あなたの答えをありがとう!私のようなコードによって引き起こされる例外は、標準的なtry/catchブロックで捕まえられません(私を修正してくださいが、私は実験的に証明しました)。キャッチの目的について:重大なエラーが発生した場合、メッセージをユーザーに投稿し、アプリケーションを正しく終了したいだけです。しかしprintfの後の例外ハンドラでは、それは間違って終了します。 – Sas

+1

"私のようなコードによって引き起こされる例外は、標準的なtry/catchブロックでは捕捉できません" - 私のポイント(1)を参照してください。 あなたの他の部分に関しては、私たちはMyVectorExceptionFilterが何であるか分かりません。質問にはタイプミスはありますか? – UKMonkey

+1

私はあなたがhttps://msdn.microsoft.com/en-us/library/windows/desktop/ms681411(v=vs.85).aspxをもう少し調べることをお勧めします – UKMonkey

2

あなたは一貫していなければなりません。あなたは、C++の例外をキャッチするC++ trycatchを使用するか、__try__except、最終的に__finallyで低レベルのエラーをキャッチするには、Microsoft構造化例外処理を使用することができます。

例では、保護されたブロックがC++キーワードtryで間違って導入されたため、例外ハンドラを入力することはありません。

違反の代わりにtry__tryに置き換えると、例外ハンドラを正しく呼び出すことができます。

+0

答えをありがとう!私はすでに 'try 'を' __try'に置き換えようとしました。質問が修正されました。 – Sas

+0

@Sas:私はもう再生できません。 UNICODEの両方で(私は、ヘッダーとして ''の#include の#include の#includeを使用して)私の古いVS2008でcatchブロックで32ビットをmain'の 終了を__exceptブロック をactionin前に、現在、問題のコードは '正しく与えますMBCSモード。唯一の奇妙なことは、問題を引き起こす可能性のあるC文字列を投げることだけです。 intまたはC++の文字列を投げるとどうなりますか? –

関連する問題