1

私はやろうとしています:

try{
    int * i = NULL;
    *i = 3;
}catch(Exception &Err){
    ShowMessage(Err.Message);
}

これはアクセス違反の例外をキャッチし、エラー メッセージを表示して処理する必要があると思います。

でも、なぜか単純になってしまう

アクセス違反

完全なメッセージの代わりにメッセージ

モジュール YYY の Violation XXX にアクセスします。アドレス ZZZ に書き込みます。

ところで、ExceptObject()ルーチンは奇妙な理由で NULL を返します。

ここで何が欠けていますか?

4

4 に答える 4

1

BCB5では、EAccessViolationのキャッチが機能します。例:

 #define AV_TRY { try {

 #define AV_CATCH } catch(EAccessViolation &av) {Application->MessageBox((("Access Violation caught: " + string(__FILE__) + "; " + string(__FUNC__) + "; " + IntToString(__LINE__) + "\n\n") + av.Message.c_str()).c_str(), ("Program Error in " + string(class_name.c_str())).c_str(), MB_OK);} }

class_nameはこのプロジェクトに固有であり、おそらくAnsiString(this-> ClassName)に置き換えるか、省略してください。また、このコードをサイレントログからデータベースへのログからMessageBoxの表示に切り替えました。AV_TRY...AV_CATCHでAVを観察したコードをラップするだけです。

于 2010-09-14T18:51:03.970 に答える
1

Mixing SEH and C++ Exceptionsに関する MSDN ブログ エントリを参照してください。これらは、2 つの異なるタイプの例外です。C++ の例外として、OS によって生成された構造化された例外をキャッチしようとすることは、そのままでは正しい方法ではありません。そうしないことに関するこの投稿で、このビットを和らげてください。

アクセス違反を検出することは良い目標ですが、デバッグのコンテキスト内でのみ実行したい場合があります。本番コードでアクセス違反 (またはその他の主要な例外) を見つけて処理しようとしても、正しい操作が行われることはめったにありません。

于 2009-06-05T11:45:26.707 に答える
0

標準 C++ では、NULL ポインターを逆参照すると例外がスローされるとは指定されていません。未定義の動作が発生すると言われています。Windows プラットフォームでは、Windows 構造化例外処理によって水が多少濁ります。一部の C++ ランタイムがこれらの例外を C++ 例外に変換する場合を除き、これは C++ 例外処理とは関係ありません。ただし、そのような変換に依存するコードは移植できません。

于 2009-06-06T13:55:10.003 に答える
-1
try {
    int * i = NULL;
    *i = 3;
}
catch (...) {
    // This would catch the access violation but you don't have any more
    // information of what has gone wrong
}

ただし、構造化例外処理 (SEH) を使用して、すべての C++ 例外をキャッチできます。C++ の例外は、SEH に基づく単なるクラス ベースの実装であるためです。

于 2009-06-06T13:34:25.177 に答える