2008-08-12 18 views
6

私は/ clrでコンパイルされたMFCアプリケーションを持っています。それ以外の場合は、捕捉されないマネージ例外の最終ハンドラを実装しようとしています。ネイティブ例外の場合は、CWinApp::ProcessWndProcExceptionをオーバーライドします。最終的に管理される例外ハンドラは、ネイティブ/管理実行可能ファイルが混在していますか?

JeffのCodeProject articleApplication.ThreadExceptionおよびAppDomain.CurrentDomain.UnhandledExceptionで提案された2つのイベントは発生しません。

誰かが複合実行ファイルの最終的な管理例外ハンドラを提供する方法を提案できますか?


更新:

それは、これらの例外ハンドラのみApplication.Runの下流または類似のトリガーされることが表示されます(ワーカースレッドの風味があります、名前を覚えてすることはできません。)あなたは本当に世界的にキャッチしたい場合SEHフィルタをインストールする必要があります。あなたはSystem.Exceptionを取得するつもりはなく、コールスタックが必要な場合は、自分の歩行者を動かす必要があります。

このトピックに関するMSDNフォーラムの質問では、try ... catch (Exception^)のメインMFCスレッドの十分に低いレベルのポイントをオーバーライドすることを推奨しました。例えば、CWinApp::Run。これは良い解決策かもしれませんが、私はperfや安定性の影響を見ていません。保釈の前にコールスタックを使用してログを取るチャンスがあります。また、デフォルトのウィンドウで妥協のない例外動作を回避できます。

+0

私があなたが言及した2つのイベントでキャッチされていないスローされている例外についてもっと知るのに役立つだろうか? – Charlie

+0

すべてのマネージ例外。System :: Exceptionの継承元。上記のイベントのポイントは、/ any/managed例外がキャッチされなかったときに発生することです。 –

答えて

2

は、インターネットの周りを見て取ると、あなたがに彼らの方法でフィルタを通過し、管理対象外の例外を取得するには、フィルタをインストールする必要があることを見つけることができますあなたのAppDomain。 CLR and Unhandled Exception Filters

CLRは、未処理の例外をキャッチするためにSEHの未処理の例外フィルタメカニズムに依存しています。

0

この2つの例外ハンドラを使用すると効果があります。あなたは、彼らが呼ばれることになるだろうし、正しく設定している場所でそれらを追加したことを確認している(つまり、アプリケーションのエントリポイントを管理するには - あなたは右、1つ入れたのか?)

+0

私は問題はどこにもApplication.Runがないことだと思います。 –

1

これらの2つの例外ハンドラを使用するとうまくいくはずです。

なぜ "する必要がありますか?"

イベントは、以下の使用して提起されていません。

extern "C" void wWinMainCRTStartup(); 

// managed entry point 
[System::STAThread] 
int managedEntry(void) 
{ 
    FinalExceptionHandler^ handler = gcnew FinalExceptionHandler(); 

    Application::ThreadException += gcnew System::Threading::ThreadExceptionEventHandler(
             handler, 
             &FinalExceptionHandler::OnThreadException); 

    AppDomain::CurrentDomain->UnhandledException += gcnew UnhandledExceptionEventHandler(
                 handler, 
                 &FinalExceptionHandler::OnAppDomainException); 

    wWinMainCRTStartup(); 

    return 0; 
} 

// final thread exception handler implementation 
void FinalExceptionHandler::OnThreadException(Object^ /* sender */, System::Threading::ThreadExceptionEventArgs^ t) 
{ 
    LogWrapper::log->Error("Unhandled managed thread exception.", t->Exception); 
} 

// final appdomain exception handler implementation 
void FinalExceptionHandler::OnAppDomainException(System::Object ^, UnhandledExceptionEventArgs ^args) 
{ 
    LogWrapper::log->Error("Unhandled managed appdomain exception.", (Exception^)(args->ExceptionObject)); 
} 

BOOL CMyApp::InitInstance() 
{ 
    throw gcnew Exception("test unhandled"); 
    return TRUE; 
} 
関連する問題