メインコンテンツ

AUTOSAR C++14 Rule M15-3-7

Where multiple handlers are provided in a single try-catch statement or function-try-block, any ellipsis (catch-all) handler shall occur last.

説明

ルール定義

Where multiple handlers are provided in a single try-catch statement or function-try-block, any ellipsis (catch-all) handler shall occur last.

根拠

try-catch ステートメントまたは function-try-block で、コンパイラは発生した例外を catch() ハンドラーと一致させます。catch(…) ハンドラーは任意の例外と一致します。同じ try-catch ステートメントまたは function-try-block 内の catch-all ハンドラーの後にあるハンドラーは、コンパイラによる例外処理プロセスで無視されて、到達不能コードになります。

catch-all ハンドラーの後にハンドラーを配置すると、意図された特定のハンドラーが実行されない理由について、開発者が混乱する可能性があります。同様に、catch-all ハンドラーが開発者の意図するように例外を処理せずに、混乱を招く可能性があります。

Polyspace 実装

try-catch ステートメントまたは function-try-block 内で catch-all ハンドラーの後にハンドラーが出現する場合、Polyspace® は常にこの欠陥を報告します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <iostream>
#include <exception>

using namespace std;

int main() {

    try {
        // some code
    } catch (exception& e1) { // Compliant

        //...

    } catch (...) { // Compliant

        //...

    } catch (exception& e2) { // Noncompliant

        //...
    }

    return 0;
}

catch (exception& e2) ハンドラーは catch(…) ハンドラーの後にあるため、Polyspace は catch-all ハンドラーの前にあるハンドラーに、非準拠としてフラグを設定します。この問題はコンパイル エラーの原因となる可能性があります。

チェック情報

グループ: Exception Handling
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入