invalid_argument
is-a logic_error
です。例外による「無効な入力」を通知する際の標準的な例外またはベストプラクティスの方法はありますか?
どちらreferencesitesはこのクラス[i.e. logic_error]
は、このような論理的な前提条件やクラス不変条件の違反として、プログラムの内部論理のエラーを報告する例外としてスローオブジェクトの種類を定義する
の行に何かを示しています。
これらのエラーは、プログラムが実行される前に検出されている可能性があります。
質問:invalid_argument
のセマンティクスが厳密に「プログラマの間違い」にバインドされていることを受け入れて、があります任意のデファクトスタンダード例外プログラム/ライブラリ/サーバーが通信するために使用することができます++ランタイムで、外部の発信者に「入力が無効です」と表示されますか?
"invalid_input"タイプの例外の使用において、あなたの経験は通常のパターンを示していますか?
もしそうなら、それは標準ですか、あるいは誰もが必要に応じて例外を派生していますか?
注:はっきり
、
stdexcept
はランタイムセマンティクスと何を提供していません。また、どちらも昇圧しない私が知っている/早期の可能性のあるルールに従っている間に、入力データ(ユーザーからのものであるかどうか)を深いコンテキストでのみ検証できる十分なケースが頻繁に見つかった:可能な限り早期のものは、 "ゲートウェイで"利用可能ではない深いコンテキストとの照合を必要とするかもしれない。 (あなたがそう好む場合、またはスタック・トレースの深い)までの呼び出しチェーンで、持っている= "通信する"
++
、
// fwd declaration
void function_facing_dirty_code(struct user_input& data);
void function_facing_the_user(const char* jsonArgs) {
try {
struct user_input;
parse_user_input(json_args, user_input);
function_facing_dirty_code(user_input);
}
catch(invalid_input& ii) {
// **this** should be a standard error for erroneous input/args/etc
// treat it by telling the out-of-my-control caller to behave
}
catch (std::runtime_exception& e) {
// tell the caller: sorry, you've done nothing wrong,
// but I'm having generic runtime troubles.
}
}
void function_facing_dirty_code(struct user_input& data) {
try {
// ... do some work
// ... do some more work
// Ahhh
throw std::invalid_argument("Requested amount over the daily redraw limit");
// ooops. This will cause a BSoD instead of telling the user.
// Because std::invalid_argument is a logic error
}
catch(std::logic_error& bsod) {
// log an error, blame the author, snitch it to his boss,
// then generate a BSoD for the user's delight,
// because she must NOT see our coding family's dirty laundry
}
}
は、なぜ、あなたのAPIが設計されていますか?もし彼らがそれを何らかの方法で検出できるなら、そうするべきです。そうしないと、論理前提条件の違反を表す例外がスローされます。 –
"これらのエラーはおそらくプログラムが実行される前に検出可能です。" 「コンパイル時にコードを記述して、これらのエラーを検出して防止する」ことを意味します。 –
混乱は何ですか?引数を渡して検証し、検証に失敗した場合は、引数が無効です。誰がなぜそれが無効だと気にする?これは、無効な引数の呼び出し元の不具合なので、プログラムの論理的なエラーです。あなたが未処理の文字列を文字列に読み込んでその文字列が無効である場合、それを引数として使用する前にそれを検証しないことはあなたのせいです。すべてが合う。 – GManNickG