1. ホーム
  2. c++

[解決済み] Catching c++ "Access Violation Writing Exception"?

2022-02-11 07:45:54

質問

c++のコードで、ユーザー入力が無効な場合に "Access Violation Writing Location ..." Exception を発生させるコードブロックがあるのですが...。

この例外を try/catch ブロックでキャッチして、例外発生時にエラーメッセージを表示しようとしたのですが、なぜかエラーはキャッチされません。

try {
    // ... some code that causes Access Violation Writing Location Exception
}
catch (...) {
    std::cout << "invalid user input" << endl;
}

このようにしましたが、例外が発生したとき、コンソールには私のエラーメッセージは表示されず、"an "があると表示されます。

Unhandled exception at 0x0F0B0E9A (msvcr110d.dll) in Example.exe : Access violation writing location

ということは、私のtry/catchブロックは例外をキャッチしていないようだ...。

ブレークポイントを設定して、例外がtryブロックの中で発生していることを確認しました。

なぜ "catch (...)" はアクセス違反の例外をキャッチしないのですか?

解決方法は?

こんなことしちゃダメ

アクセス違反はC++の例外ではありません。オペレーティングシステムがアプリケーションを終了させようとするもので、何か不正なことをしたからです。

具体的には、アクセスする権限のないメモリ・アドレスに書き込もうとしたのです。これは基本的にランダムなメモリに書き込むということで、たとえ した このエラーをキャッチし、ユーザーに適切なエラーメッセージを表示しても、常にうまくいくとは限りません。時には、書き込み権限のないメモリに書き込む代わりに、プログラムの他の部分に書き込んでしまうこともあるかもしれません。この場合、アクセス違反は発生しないので、問題は検出されません。プログラムが壊れてしまうだけです。

その のみ これを行うには、ユーザーの入力を検証するのが正しい方法です。 あなたは は、ユーザー入力がプログラムで安全に処理できる形式であることをチェックしなければなりません。そうでない場合は、入力内容を修正するか、あるいは中止してユーザーにエラーを表示しなければなりません。これは自分のコードで行わなければなりません。 前に OSが強制的に終了させるような悪いことをするアプリケーションです。

はい、あります。 アクセス違反を処理する方法がありますが、上で述べたように、それはあなたの問題に対する正しい解決策ではないので、それについて詳しく説明する理由はないと思います。