8

我很好奇一旦你抛出一个你将如何维护你的代码System.ComponentModel.InvalidEnumArgumentException.

基本上我有一个这样的 switch 语句:

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

    case MyEnum.Value2:
        break;

    default:
        throw new InvalidEnumArgumentException();
}

例如,如果我决定MyEnum在未来添加更多值怎么办?Value3Value4添加更多的值怎么办?这意味着我最终会抛出一个误导性的异常。我将如何防止这种情况?

我应该在投掷前使用反射吗?在这种情况下我应该抛出什么异常?我正在寻找建议。


几分钟前我刚刚发现了这个异常,所以也许我在错误的上下文中看待这个。当某个枚举参数不受支持时(在这种情况下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 回答