AUTOSAR C++14 Rule A15-1-1
Only instances of types derived from std::exception should be thrown
説明
ルール定義
Only instances of types derived from std::exception should be thrown.
根拠
汎用オブジェクトが例外として発生すると、コードの読み取りや再利用が困難になる可能性があります。2 つの異なる try-catch ブロックで例外が発生する次のコードについて考えます。
try{
//..
throw 1; // 1 means logic error;
}
catch(...){
//...
}
//...
try{
//...
throw std::logic_error{"Logic Error"};
}
catch(std::exception& e){
//..
}2 つ目のコード ブロックでは、固有のタイプのオブジェクトを例外として発生させることにより、例外の意味と原因が明確に伝達されています。このような throw ステートメントは、標準規則にも合致します。開発者の意図を明確に伝達し、標準規則に準拠し、固有のタイプの例外を発生させることにより、コードの読み取り、理解、および再利用が容易になります。
クラス std::exception は、特定のエラーに対応する固有の例外を発生させるための一貫したインターフェイスを提供します。これは、このインターフェイスを使用して例外を発生させるための標準規則です。コードを読みやすく、再利用可能にするには、std::exception から派生した特定のタイプのオブジェクトを例外として発生させます。std::exception タイプの汎用オブジェクトは固有にできません。このような例外はこのルールに違反します。
Polyspace 実装
Polyspace® は、発生するオブジェクトのタイプが
std::exceptionからパブリックに派生したクラスではない場合に、throwステートメントにフラグを設定します。発生するオブジェクトが多重継承階層の一部の場合は、Polyspace が、どの基底クラスも
std::exceptionからパブリックに派生していないまたは基底クラスにstd::exceptionが含まれていない場合に、オブジェクトにフラグを設定します。catch ブロックに引数が含まれていない
throw;ステートメントを使用する場合は、Polyspace がthrow;ステートメントにフラグを設定しません。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: Exception handling |
| カテゴリ: Advisory、Automated |
バージョン履歴
R2020b で導入