6

std::logic_errorネストされた if/elseif return true/false の複雑なリストを使用する代わりに、の使用法について誰かの意見を探しています。

以下のような多くの同様の機能から移動したい

bool validate_data(){
    std::vector<int> v; 
    //fill with data
    if( v.find(10) == v.end() ){
       return false;
    } 
    // other checks that return false
}

bool validate_data(){
    std::vector<int> v; 
    //fill with data
    if( v.find(10) == v.end() ){
       throw std::logic_error("error message");
    } 
    // other checks that return false
}

このすべての関数リストを 1 つのtry-catchブロックで呼び出します。

おそらくから派生したものなのでstd::exception、それが良いアイデアかどうかはわかりません。

以下の例のように使用している人はいますか?

どうもありがとう

AFG

4

3 に答える 3

5

例外的な状況でのみ例外を使用してください。

値 10 を見つけることは例外的な状況ではありませんか? それともただの正常な状態ですか?

メソッドの名前を validate_data から is_data_valid に変更すると、より明確になります。メソッドが true を返す場合、それは有効です。false を返す場合は、そうではありません。これには例外を使用する必要はありません。

于 2012-05-15T13:04:57.077 に答える
5

例外的な状況でのみ例外を使用する必要があります。戻り値を使用 (およびチェック) することは、それが true または false である可能性が自明ではない場合にはるかに効率的です。スローの可能性が非常に小さいため、戻り値チェックのコストを上回る場合にのみ、例外がより効率的になります。

したがって、無効なデータの可能性が非常に低い場合は、例外を使用してください。それ以外の場合、現在のソリューションは適切であるだけでなく、わずかに効率的でもあるはずです (スローと処理は比較的高価であるため)。

于 2012-05-15T13:06:16.013 に答える
3

関数が呼び出されるので、関数validate_data()内に内部エラーがある場合にのみ例外をスローし、関数が入力を検証したが、それが()または無効( )であることを示すためにtrueまたはを使用します。falsevalidreturn truereturn false

これにより、複数のif() else if() else構成を使用できなくなることはありませんが、コードがよりクリーンになり、データが無効であるか内部エラーが発生したかを簡単に区別できるようになります。

try {
  bool valid = validate_data(foo);
  /* process data or break if invalid */
} catch (std::exception &ex) {
  /* internal error happened */
}

ご覧のとおり、コードが長くなり、IMHOがよりクリーンになります。

于 2012-05-15T13:03:51.223 に答える