8

をスローしたら、コードをどのように維持するのか興味がありますSystem.ComponentModel.InvalidEnumArgumentException

基本的に、次のような switch ステートメントがあります。

switch (enumValue)
{
    case MyEnum.Value1:
        break;

    case MyEnum.Value2:
        break;

    default:
        throw new InvalidEnumArgumentException();
}

将来、さらに値を追加することにした場合はどうすればよいでしょうか?MyEnumたとえば、Value3and Value4? それは、誤解を招く例外をスローしてしまうことを意味します。どうすればこれを防ぐことができますか?

投げる前に反射を使用する必要がありますか? この場合、どの例外をスローする必要がありますか? 提案を探しています。


数分前にこの例外を発見したので、間違った文脈でこれを見ているのかもしれません。この例外は、特定の列挙型引数がサポートされていない場合 (サポートされていない場合) にスローされValue3ますValue4か?

4

6 に答える 6

11

あなたが述べる問題はコンテキストによって異なります。メソッドが引数として列挙を受け取る場合、サポートする値と未知の列挙値で何をするかを指定する必要があります。

列挙オプションをさらに追加する場合は、既定のケースで例外をスローしていなくても、何をすべきかを決定する必要があります。

任意の整数を列挙値として渡すことができるため、例外が特に役立つことに注意してください。

例えば:

enum Foo { A, B }

static int Bar(Foo f)
{
    switch (f)
    {
        case Foo.A:
            return 1;
        case Foo.B:
            return 2;
        default:
            throw new InvalidEnumArgumentException("f", (int)f, typeof(Foo));
    }
}

static void Main()
{
    Bar(Foo.A);
    Bar((Foo)99);
}
于 2011-07-01T09:59:45.013 に答える
5

将来 MyEnum に Value3 や Value4 などの値を追加する場合はどうすればよいですか? それは、誤解を招く例外をスローしてしまうことを意味します。どうすればこれを防ぐことができますか?

InvalidEnumArgumentException理解するための重要なことを使用しているときは、引数です。例外をスローすることにより、メソッドの引数が無効であると言っています。(InvalidEnumArgumentExceptionから派生しArgumentExceptionます。) 必ずしも値が のメンバーではなかったという意味ではありませんenum。したがって、誤解を招くとは思いません。

于 2012-10-02T05:40:30.383 に答える
0

そのコンテキストで使用している例外を使用することはありません。enumValue が MyEnum 型であるため (推測しますか?)、無効な列挙値を含めることはできません。値を認識しない場合に失敗する必要がある列挙型の値に基づくスイッチがある場合は、適切な例外 (おそらく通常の ArgumentException?) をスローする必要がありますが、ほとんどの場合、未知の列挙値に対してコード実行に何もさせないでください。

于 2011-07-01T09:55:12.403 に答える
0

例外を間違った方法で使用しています:

http://msdn.microsoft.com/en-us/library/system.componentmodel.invalidenumargumentexception.aspx

この例外は、無効な列挙値をメソッドに渡すか、プロパティを設定するときにスローされます。

于 2011-07-01T09:55:15.647 に答える
0

これらが列挙型ではなく、何らかのビジネスルールに基づいた特定の値である場合、間違ったコンテキストで見ていると思います。そのため、ルールが増加するような場合は、これらのような関連コードを修正して新しいコードを組み込みます. したがって、Enum を変更している場合は、このような変更を確認する必要があります。

于 2011-07-01T09:56:15.753 に答える
-1

着信列挙値を検証するには、次の静的メソッドを使用します...

public void MyMethod(MyEnum e)
{
    if (!Enum.IsDefined(typeof(MyEnum), e))
        throw new InvalidEnumArgumentException("e", (int)e, typeof(MyEnum));

...そして、将来新しい列挙値が追加された場合、チェックを変更する必要はありません。

于 2011-07-01T10:06:04.330 に答える