9

int を返す挿入クエリがあります。その int に基づいて、例外をスローしたい場合があります。これは、switch ステートメント内で行うのが適切ですか?

 switch (result)
        {

            case D_USER_NOT_FOUND:
                throw new ClientException(string.Format("D User Name: {0} , was not found.", dTbx.Text));
            case C_USER_NOT_FOUND:
                throw new ClientException(string.Format("C User Name: {0} , was not found.", cTbx.Text));
            case D_USER_ALREADY_MAPPED:
                throw new ClientException(string.Format("D User Name: {0} , is already mapped.", dTbx.Text));
            case C_USER_ALREADY_MAPPED:
                throw new ClientException(string.Format("C User Name: {0} , is already mapped.", cTbx.Text));
            default:

                break;
        }

通常、スイッチに break ステートメントを追加しますが、ヒットしません。これはデザインが悪いのでしょうか?意見や提案があれば教えてください。

ありがとう、サンディエゴで~ck

4

8 に答える 8

12

なぜだめですか?

C# プログラミング言語、第 3 版より。Anders Hejlsberg et al, page 362:

通常、switch セクションのステートメント リストはbreakgoto case、またはgoto defaultステートメントで終了しますが、ステートメント リストの終点を到達不能にする構成はすべて許可されます。[...] 同様に、throworreturnステートメントは常に制御を別の場所に移し、終点に到達することはありません。したがって、次の例は有効です。

switch(i) {
case 0:
    while(true) F();
case 1:
    throw new ArgumentException();
case 2:
    return;
}
于 2010-04-22T18:22:11.907 に答える
4

問題ありません...なぜこれは悪いデザインなのでしょうか?

または、例外の種類がすべてで同じであるcaseため、エラーメッセージのルックアップテーブルを作成できます。これにより、コードの重複を減らすことができます。例えば:

static private Dictionary<int, string> errorMessages;
static
{
    // create and fill the Dictionary
}

// meanwhile, elsewhere in the code...
if (result is not ok) {
    throw new ClientException(string.Format(errorMessages[result], cTbx.Text, dTbx.Text));
}

{0}メッセージ自体で、、などを使用して適切なパラメータを選択できます{1}

于 2010-04-22T18:19:27.867 に答える
3

私はあなたの変数の命名規則にはあまり同意しません ;) が、なぜあなたのしたことが不適切なのかわかりません。エラーをある媒体から別の媒体に変換するのは、かなり洗練された方法のように思えます。

あなたの「挿入クエリ」は何らかの形のストアドプロシージャであると想定しています。

于 2010-04-22T18:17:28.073 に答える
1

可能であれば、失敗した結果が設定されている場所にスローした方がよいでしょう。そうしないと、結果のチェックとスローの両方を実行する必要があります。しかし、もちろん不可能かもしれません。

また、文言を変更したい場合に複数の場所を変更する必要がないように、エラー文字列をプレースホルダー付きのリソースまたは定数にします。

于 2010-04-22T18:18:31.773 に答える
0

これで大丈夫だと思います。switchステートメントを使用して、リターンコードを例外にマッピングしているようです。あまり多くない限り、これは問題ではありません。

于 2010-04-22T18:18:17.680 に答える
0

あなたが取っているアプローチに問題はありません。switchステートメントはif/thenステートメントよりもはるかに読みやすくなっています(そして潜在的にも高速です)。あなたができる他のことは、可能な例外をロードすることです

Dictionary<Result_Type, Exception>

そこから例外をプルします。多くのswitchステートメントがある場合、これによりコードがよりコンパクトになります(必要に応じて、実行時にそれらを追加および削除できます)。

于 2010-04-22T18:19:53.263 に答える
0

たぶん私はここのすべての答えとは違うように頼みます。

コードを切り替える代わりにresultClientExceptionクラスに渡して、表示する必要のある文字列を決定させるのではなく、さまざまなメッセージを作成するために醜いスイッチをあちこちに配置します。

私のコードは次のようになります。

throw new ClientException(result, cTbx.Text);

だから、あなたがエラーを投げることができたとしてもswitch...case、あなたはそれを避けることができますすべては私の見解です

于 2010-04-22T18:43:57.657 に答える
0

あなたの場合、スイッチを使用しても問題はありません。

例外自体が適切かどうかをより強く検討する必要があります。一般に、例外は、予想される動作の範囲外の状況が発生した場合にのみ使用する必要があります。例外は、プログラム フロー ロジックとして使用しないでください。あなたの場合、私が見たコードに基づいてそれらを使用しても問題ないでしょう。

于 2010-04-22T18:24:56.203 に答える