3

C++ の例外とは異なり、アクセス違反は、アプリケーションのランタイムが危険にさらされていることを示し、アプリケーションの状態が未定義であることを示します。そのような状況で行う最善の方法は、アプリケーションを終了することです (通常はクラッシュするため、自動的に終了します)。

これらの例外の 1 つをキャッチすることが可能であることに注意してください。たとえば、Microsoft Visual C++ では、/EHaor__try/__catchを使用してそうすることができます。

では、それらを捕まえたい理由は何ですか?私が理解しているように、アプリケーションを回復する方法はありません。

4

5 に答える 5

8

アクセス違反から回復できます。

たとえば、動的配列を作成するには、 を使用してアドレス空間を割り当てますがVirtualAlloc、それが指すメモリを非存在としてマークします。次に、一部のメモリを使用しようとすると、アクセス違反をキャッチし、アクセスが発生したメモリのページをマップしてから、違反の原因となった命令を再試行します。

于 2012-06-19T20:58:58.667 に答える
6

理由の 1 つは、クラッシュ ダンプ ファイルを作成することです。あなたはそれをより細かく制御し、あなたが望む正確な型を書くことができます. たとえば、Windows では、MiniDumpWriteDumpを呼び出してこれを行うことができます。

于 2012-06-19T20:58:40.607 に答える
3

すべてのアクセス違反の後、アプリが安定しているとは限りません。ただし、しばらくすると安定するか回復する可能性があるため、アクセス違反をキャッチすると、次のことが可能になります。

  1. 問題が発生したことをユーザーに通知する
  2. ユーザーに作業の保存を試行させる
  3. 回復を試みる
  4. 診断情報をログに記録する
  5. 消えるのではなく、好きなように出てください。

この典型的な例は、プラグインからの例外をキャッチするホスト アプリケーションです。このようにして、ホスト アプリ (Photoshop など) は、ユーザーに「Plugin X がクラッシュし、Photoshop が不安定になりました...作業を保存して、Photoshop を再起動する必要があります」と伝えることができます。

これは C++ の例外処理とは異なることに注意してください。C++ の例外処理は回復不能なエラーをまったく示しませんが、スタックの巻き戻し機能に近いものです。

于 2012-06-19T21:25:37.183 に答える
1

アプリケーションが消えるだけでなく、優雅にクラッシュして何が起こっているのかをユーザーに知らせる方が良いと思います。

于 2012-06-19T20:59:09.497 に答える
1

アプリケーションでアクセス違反が発生した場合、回復できる場合とできない場合があります。アプリケーションが未定義の状態のままになっている場合、たとえばスタックを壊してしまいます。

暴走ポインターから読み取っても、おそらくアプリケーションが破損することはなく、そこから回復できる可能性があります。

いずれにせよ、それが発生しているという事実は、コードにバグがあることを示しているため、回復しようとするのではなく、エラーをキャッチして、問題のデバッグに役立つ状態をダンプする必要があります。

于 2012-06-19T21:24:53.003 に答える