2

通常、アクセス違反はプログラムを終了し、とを使用してWin32例外をキャッチできませtrycatch。アクセス違反が発生した場合でも、プログラムを実行し続ける方法はありますか?できれば、例外を処理して、アクセス違反が発生したことをユーザーに示したいと思います。

編集:プログラミングエラーに対しても、プログラムを本当に堅牢にしたいです。私が本当に避けたいのは、破損した状態を犠牲にしてもプログラムの終了です。

4

2 に答える 2

4

Windowsでは、これは構造化例外処理(SEH)と呼ばれます。詳細については、こちらをご覧ください。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657%28v=vs.85%29.aspx

実際には、例外が発生したときにコールバックを取得するように登録できます。明らかな理由により、すべての例外に対してこれを行うことはできません。

SEHを使用すると、アクセス違反を含む多くの例外を検出できますが、すべてではありません(たとえば、二重スタック障害)。検出可能な例外がある場合でも、例外後に100%の安定性を保証する方法はありません。ただし、ユーザーに通知し、エラーをログに記録し、サーバーにメッセージを送り返して、正常に終了するだけで十分な場合があります。

于 2013-01-30T18:42:40.723 に答える
3

まず、あなたの質問には矛盾が含まれていると言います。

編集:私は私のプログラムを本当に堅牢にしたいです...私が本当に避けたいのは、いくつかの破損した状態を犠牲にしてもプログラムの終了です。

破損した状態の場合にリンピンを維持するプログラムは堅牢ではなく、責任があります。


第二に、ある種の意見。それにかんする:

編集:プログラミングエラーに対しても、プログラムを本当に堅牢にしたいです。..。

プログラミングエラーによってすべてのバグを意味する場合、これは不可能です。

プログラミングエラーとは、「プログラマーが一部のAPIを誤用し、クラッシュではなくエラーメッセージが必要な場合は、ダブルチェックが組み込まれたすべてのコードを記述します。たとえば、使用する前に、常にすべてのポインターのNULLをチェックします。プログラマーが間違えなかった場合はNULL」など(ああ、C++を使用しないことも検討してください;-)

しかし、私見では、C ++アプリケーションでは、プログラムがクラッシュすることなく、どのようなバグを受け入れる必要がありますか。(それが些細なことであるか、軍事的または医学的使用のためにそれから地獄をテストしない限り(それでも...))


他の人はすでにSEHについて言及しました-それはの「単純な」問題です__try / __catch

プログラム内のバグを見つけようとする代わりに、Windowsエラー報告(WER)と友達になろうとするかもしれません-私はこれを引っ張ったことはありませんが、私が理解している限り、OutOfProcessException... コールバック関数を介して完全にカスタマイズできます。

于 2013-01-30T18:51:13.047 に答える