2017-12-10 18 views
0

Visual Studio 2017でC++のassertメソッドをテストしていますが、予期したとおりにアサーション例外が発生しています。しかし、すべての(!)例外設定を無効にした後で、私のcatchブロックで処理する前に例外がスローされます(以下の例を参照)。Visual Studioの例外設定が無視されました。C++

try { 
    assert(validate(1363821) == false); 
    assert(validate(3848238) == true); 
    printf("Validation correctly implemented."); 
} catch (exception & e){ 
    const string error = e.what(); 
    printf("Validation failed!"); 
} 

だから私の質問は以下のとおりです。

  • 私はここで何か間違ったことをやっていますか?
  • または、assertメソッドはcatchブロックで処理できない何らかの例外をスローし、常に致命的な例外を生成しますか?もしそうなら、致命的なエラーを生成することなく、どのようにアサートメソッドを実装できますか?下記に示されるよう

私の例外設定が設定されていない: enter image description here

すべてのヘルプは大歓迎です!

+0

「キャッチブロックで処理できるようになる前に例外がスローされる場合は、ビジュアルスタジオではないメッセージボックスが表示され、アサートがどのように実装されているか」ということです。 – tkausl

+0

@tkausl messageboxのタイトルは "Microsoft Visual C++ランタイムライブラリ"で、「デバッグエラー!」と表示されます。メッセージ。これはVisual Studioではありませんか?そうでない場合、どのようにしてこのメ​​ッセージボックスを防ぐことができますか?または、設計上のこの動作は変更できませんか? – etri

+2

リリースモードでコンパイルします。しかし、あなたのコードはあなたのコードが期待どおりに動作するかどうかを確認しているようですが、その目的のためにテストフレームワークを使うべきです。 – tkausl

答えて

2

アサーションの失敗は例外をスローしません。代わりに、インプリメンテーション固有のレポートアクション(エラーメッセージをstderrに出力する、またはそのダイアログを表示するなど)を実行し、std::abortを呼び出します。だから、catch IDEのブロックや例外処理設定はこのような状況では何もしません。アサーションで例外をスローするには、assertマクロ置換を記述する必要があります。

いくつかのソート検証チェックをお探しの場合は、boost :: testなどの専用フレームワークを使用することをお勧めします。

BOOST_AUTO_TEST_CASE(Doc_Parse_Empty) 
{ 
    BOOST_TEST(validate(1363821) == false); 
    BOOST_TEST(validate(3848238) == true); 
} 

また、成功/失敗のレポートを自動的に処理し、VSにシームレスに統合することもできます。

+0

ああ、そうだ。だから、assertメソッドはバグがあり、アプリケーションを終了することを指摘するのに実際に正しいと思うので、try catchブロックで簡単に回避することはできません。それですか? – etri

+0

ちょっと不思議そう...「Win32 Exceptions> 0xc0000420アサーションが失敗しました」という例外設定のため、間違ったトラックにセットされました。だから明らかにこれはアサートメソッドのエラーを押さえることとは何の関係もないのですか? – etri

+1

@etriデバッグビルドのインバリアントを処理するための 'assert'マクロが存在します。また、アサーションの失敗は致命的なエラーとして扱われます(プログラムの実行は継続できません)。しかし、私はいくつかの選択肢で私の答えを更新しました。 – VTT

関連する問題