代码之家  ›  专栏  ›  技术社区  ›  Jon Skeet

无效泛型类型参数的最佳异常

  •  115
  • Jon Skeet  · 技术社区  · 16 年前

    UnconstrainedMelody

    旨在与“flags”枚举一起使用。我不能将此添加为约束。..因此,它们也可能被其他枚举类型调用。在这种情况下,我想抛出一个异常,但我不确定该抛出哪个。

    // Returns a value with all bits set by any values
    public static T GetBitMask<T>() where T : struct, IEnumConstraint
    {
        if (!IsFlags<T>()) // This method doesn't throw
        {
            throw new ???
        }
        // Normal work here
    }
    

    最好的例外是什么? ArgumentException 类型 TypeArgumentException 班级?使用 InvalidOperationException ? NotSupportedException 还有别的吗?

    我愿意 除非这显然是正确的做法,否则我不会为此创建自己的例外。

    11 回复  |  直到 16 年前
        1
  •  42
  •   Community Mohan Dere    9 年前

    NotSupportedException 声音 就像它很适合一样,但文档明确指出它应该用于不同的目的。来自MSDN课堂备注:

    有些方法不是 在基类中得到支持 仅实现方法的一个子集 从基础班,扔 的NotSupportedException 不支持的方法。

    Unconstrained Melody ...

    使用泛型可以完成各种有用的事情 存在“T:enum”或“T:”类型约束的方法/类

    这个实用程序库使用ildasm/ilasm绕过了禁令。..

    …它看起来像一个新的 Exception Exceptions InvalidTypeParameterException 可能在整个库中都有用(也可能没有——这肯定是一个边缘案例,对吧?)。

    客户是否需要能够将其与BCL例外区分开来?客户何时可能意外地使用香草调用此功能 enum What factors should be taken into consideration when writing a custom exception class?

        3
  •  12
  •   l33t    9 年前

    泛型编程不应在运行时抛出无效的类型参数。它不应该编译,你应该有一个编译时强制。我不知道是什么 IsFlag<T>() traits

    更新

    如果你 必须 与(方法)参数相关的错误以ArgumentException层次结构为中心。然而 recommendation

    如果故障不涉及 InvalidOperationException应为 使用。

    至少有一个信念的飞跃,那就是 参数建议也适用于

        4
  •  9
  •   Robban    16 年前

    我会使用NotSupportedException,因为这就是你所说的。除特定枚举之外的其他枚举包括

        5
  •  8
  •   Mehrdad Afshari    16 年前

    显然,微软使用 ArgumentException 如示例所示 Expression.Lambda<> , Enum.TryParse<> Marshal.GetDelegateForFunctionPointer<> TDelegate TEnum

    因此,我认为可以安全地假设,至少在微软代码中,使用 用于除基本变量参数之外的无效泛型类型参数。鉴于中的异常描述 docs

        6
  •  3
  •   Carl Bergquist    16 年前

    我会和你一起去 NotSupportedException ArgumentException 看起来不错,当传递给方法的参数不可接受时,这是意料之中的。类型参数是您要调用的实际方法的定义特征,而不是真正的“参数” InvalidOperationException 当您正在执行的操作在某些情况下是有效的,但对于特定情况,这是不可接受的时,应该抛出。

    冒号 当操作本身不受支持时抛出。例如,在实现一个特定成员对类没有意义的接口时。这看起来是类似的情况。

        7
  •  3
  •   Alice    10 年前

    我将使用NotSupportedExpection。

        8
  •  2
  •   Eric Schneider    16 年前

        9
  •  1
  •   BFree    16 年前

    我总是对编写自定义异常持谨慎态度,纯粹是因为它们并不总是被清楚地记录下来,如果命名不正确,会造成混淆。

    编辑:

    我还看到NotSupportedExceptions被抛出为许可异常“您正在运行此软件的免费版本,不支持此功能”。

    编辑2:

    System.ComponentModel.InvalidEnumArgumentException  
    

        10
  •  1
  •   Peter    16 年前

    我也会投票支持InvalidOperationException。我做了一个(不完整的)流程图 .NET exception throwing guidelines Framework Design Guidelines 2nd Ed.

        11
  •  1
  •   TrueWill    16 年前