AUTOSAR C++14 Rule A15-1-3
All thrown exceptions should be unique
説明
ルール定義
All thrown exceptions should be unique.
根拠
同じオブジェクトが複数の場所で例外として発生した場合、これらの例外の処理とコードのデバッグが困難になる可能性があります。一意の例外オブジェクトを発生させると、デバッグ プロセスが簡略化されます。複数の例外が発生する次のコードについて考えます。
void f1(){
//...
throw std::logic_error("Error");
}
void f2(){
//...
throw std::logic_error("Error");
}
void f3(){
//...
throw std::logic_error("f3: Unexpected Condition");
}
int main(){
try{
f1();
f2();
f3();
catch(std::logic_error& e){
std::cout << e.what() << '\n';
}
}
}f1() と f2() は同じ例外を発生させますが、f3() は一意の例外を発生させます。デバッグ中は、例外が f1() と f2() のどちらから発生したかを判断できません。例外が f3() から発生した場合には判断がつきます。デバッギング プロセスを簡略化するには、一意の例外を発生させます。以下の条件のどちらかが当てはまる場合、例外は一意です。
例外の型がプロジェクト内の他の場所で発生していない。
エラー メッセージまたはエラー コードがプロジェクト内の他の場所で発生していない。
Polyspace 実装
Polyspace® は、同じクラス、列挙値、整数、または定数リテラルを例外として発生させる throw ステートメントを強調表示し、同じオブジェクトを発生させる最後のスロー ステートメントにフラグを設定します。事前構築された例外オブジェクトを使用して、同じ例外を複数の場所で発生させるとします。Polyspace は、このような事前構築された例外オブジェクトを発生させる throw ステートメントにフラグを設定しません。同じリテラル オブジェクトを複数の場所で発生させる場合、そのリテラルが定数でないか、リテラルが変数の後ろに隠れるのであれば、Polyspace はそのリテラル オブジェクトにフラグを設定しません。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: Exception handling |
| カテゴリ: Advisory、Automated |
バージョン履歴
R2020b で導入