メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

前のハンドラーによって隠された例外ハンドラーです

同じ例外に対して catch ステートメントが先行しているため、catch ステートメントに到達しない

説明

この欠陥は、先行する catch ステートメントが例外を処理したために、catch ステートメントに到達しなかった場合に発生します。

たとえば、catch ステートメントがクラス my_exception のオブジェクトを受け取り、後出の catch ステートメントが次のいずれかを受け取る場合などです。

  • my_exception クラスのオブジェクト。

  • my_exception クラスから派生したクラスのオブジェクト。

リスク

catch ステートメントに到達しないため、実質的にデッド コードとなります。

修正方法

1 つの修正方法として、余分な catch ステートメントを削除します。

別の修正方法として、catch ステートメントの順序を逆にします。派生クラスの例外を受け取る catch ステートメントを、基底クラス例外を受け取る catch ステートメントの前に配置します。

すべて展開する

#include <new>

extern void print_str(const char* p);
extern void throw_exception();

void func() {
    try {
        throw_exception();
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }

    catch(std::bad_alloc& exc) {
        print_str(exc.what());
    }
}

この例では、2 番目の catch ステートメントが std::bad_alloc オブジェクトを受け取ります。std::bad_alloc クラスは std::exception クラスから派生しているため、2 番目の catch ステートメントはその前の、std::exception オブジェクトを受け取る catch ステートメントによって隠されます。

欠陥は、catch ステートメントのパラメーター タイプに表示されます。いずれの catch ステートメントが現在の catch ステートメントを隠しているかを探るには、次のようにします。

  1. [ソース] ペインでキーワード catch を右クリックし、[現在のソース ファイル内で "catch" を検索] を選択します。

  2. [検索] ペインで、現在の catch ステートメントから逆順に、各検索結果をクリックしていきます。欠陥のある catch ステートメントを隠している catch ステートメントが見つかるまで続行します。

修正 — catch ステートメントを並べ替える

1 つの修正方法として、派生クラス パラメーターのある catch ステートメントを先に配置します。

#include <new>

extern void print_str(const char* p);
extern void throw_exception();

void corrected_excphandlerhidden() {
    try {
        throw_exception();
    }
    
    catch(std::bad_alloc& exc) {
        print_str(exc.what());
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }
}

結果情報

グループ: C++ の例外
言語: C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: EXCP_HANDLER_HIDDEN
影響度: Medium

バージョン履歴

R2015b で導入