14

:これは値ではなく引数を扱うため、提案された複製とは異なります。動作と適用可能なシナリオは本質的に異なります。

SomeEnum次のように処理するswitchステートメントがあるとします。

enum SomeEnum
{
    One,
    Two,
}

void someFunc(SomeEnum value)
{
    switch(value)
    {
        case SomeEnum.One:
            ...
            break;
        case SomeEnum.Two:
            ... 
            break;
        default:
            throw new ??????Exception("Unhandled value: " + value.ToString());    
    }
}

ご覧のとおり、可能なすべての列挙値を処理しますが、新しいメンバーが追加された場合に備えてデフォルトで例外をスローし続け、処理の欠落を認識していることを確認します。

私の質問は、指定されたコードパスが処理/実装されていない、またはアクセスされるべきではないことを通知したい場合の正しい例外は何ですか?以前は使用しNotImplementedExceptionていましたが、適切ではないようです。次の候補はですInvalidOperationExceptionが、その用語は正しく聞こえません。正しいものとその理由は何ですか?

編集:C#8.0では、非記述的なswitchステートメントに対してコンパイラ警告を生成するswitch式が導入されました。これが、該当する場合は常にswitchステートメントではなくswitch式を使用する必要があるもう1つの理由です。同じ関数は、次のようなより安全な方法で記述できます。

void someFunc(SomeEnum value)
{
    _ = value switch
    {
        SomeEnum.One => ....,
        SomeEnum.Two => ...., 
    }
}

新しいメンバーがに追加されるSomeEnumと、コンパイラは警告「CS8509:スイッチ式はその入力タイプのすべての可能な値を処理しません(網羅的ではありません)を表示します。たとえば、パターン'EnumHandling.SomeEnum.Three'は覆われていない。" 潜在的なバグを見つけやすくするスイッチ式の場合。

4

5 に答える 5

20

ArgumentExceptionこの場合、私には最も正しいように見えます(ただし、BCLでは定義されていません)。

列挙型引数には特殊な例外があります-InvalidEnumArgumentException

列挙子である無効な引数を使用した場合にスローされる例外。

別の方法はArgumentOutOfRangeExceptionです:

引数の値が、呼び出されたメソッドで定義された許容値の範囲外の場合にスローされる例外。

これらを使用するためのロジックは、渡された引数(value)は、関係する限り有効ではないということですsomeFunc

于 2012-11-30T11:54:56.260 に答える
13

InvalidEnumArgumentExceptionこの場合、より詳細な情報が得られるので、列挙型をチェックしています。

于 2012-11-30T11:58:11.787 に答える
4

関数にログインしているので、InvalidArgumentExceptionをスローできます。

無効なパラメータがサーバーへの参照接続のメソッドに渡されたときに発生する例外。

編集: より良い代替案は次のようになります:名前空間にあるため、ArgumentException 。何かのようなもの:InvalidArgumentExceptionMicrosoft.SqlServer.Management.Common

throw new ArgumentException("Unhandled value: " + value.ToString());
于 2012-11-30T11:55:47.277 に答える
0

コードコントラクト(私が強くお勧めするもの)を使用している場合、メソッドの先頭にこれを配置します。

Contract.Requires(value == SomeEnum.One || value == SomeEnum.Two);

個々の値が多すぎてすべてを明示的に記述できない列挙型の範囲をチェックする場合は、次のように実行できます。

Contract.Requires(SomeEnum.One <= value && value <= SomeEnum.Two);
于 2012-11-30T12:03:16.300 に答える
0

InvalidArgumentException。ユーザーが無効な値を渡すか、値の値が必要なときにnull値を渡す場合は、InvalidArgumentExceptionを処理することをお勧めします。

于 2012-11-30T11:59:36.250 に答える