2012-03-13 25 views
1

私はモデルのダイアログを表示してユーザーが何かをするのを待つ機能を持っていますが、それは複雑で何かが間違っている可能性があり、この場合例外がスローされます。ここで モーダルダイアログから例外をスローする最良の方法は何ですか?

は、例外処理でこの関数を呼び出すことが想定コードを次のとおりです。

try { 
    CMyDialog mydialog(); 
    mydialog.DoModal(); 
} 
catch(std::logic_error &e){ 
    DoExceptionHandling(); 
} 

ダイアログUIがATLで書かれた、と私たちは次のようにボタンのOnClickハンドラがあるとしましょうされています

LRESULT CMyDialog::OnBnClickedBlah(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/){ 
    ... 
    throw std::logic_error("BlahBlah"); 
} 
は、

しかし、上記のコードを実行すると、例外がスローされると、デバッグモードで、ダイアログのHWNDがヌルであると主張するATLアサーションがトリガされました(ただし、実際にはまだクリアされません)。

私が知りたいのは、この問題を解決し、呼び出し元が例外を捕捉でき、すべてのリソースが適切に解放されていることを確認することです。

答えて

1

いくつかのアドバイス:私はメッセージの境界を越えて例外をスローしないようにしようとするだろう、と特に違いはありませんモーダルメッセージループを

。いくつかの介在層があり、たとえそれが機能していても(この場合はそうではないように見える)、問題を求めています。

EndDialogをエラーで使用し、呼び出し元がダイアログから「予期しない」結果コード(例:IDCANCEL)を調べることができるダイアログクラスに何らかのエラーコードを格納することをお勧めします。そうすれば、ダイアログはエラーで "消え去る"、すべてが適切にクリーンアップできるようになり、非標準のダイアログエラー処理ですべてが機能することを心配する必要はありません。私の2c。

+0

あなたのアドバイスは良いです。しかし私はここで私の動機を説明したい。 'DoModal'への呼び出しは、通常のGUIレスの関数呼び出しのように構文的に見えます。なぜなら、実行フローが終了するまで実行フローをブロックするからです。実装は実際には全く異なるが、なぜ同じにすることができないのか理解していますか? 1つの解決策は、ダイアログオブジェクトの作成と 'DoModal'メソッドを1つの関数にカプセル化し、あなたのアドバイスを適用することです。 –

1

あなたの問題を解決する必要がありEndDialogを呼び出す:

CMyDialog mydialog(); 
try { 
    mydialog.DoModal(); 
} 
catch(std::logic_error &e){ 
    mydialog.EndDialog(IDABORT); 
    DoExceptionHandling(); 
} 

そして、はい、モジュールの境界を越えて渡す例外が推奨されていません。

関連する問題