应该抛出哪个异常?

7

我编写了一个自定义操作方法选择器属性,它有三个bool属性。这三个属性都为false是无效的。至少其中一个必须为true。当执行IsValidForRequest时,我会检查它们中至少有一个是true。但如果没有,我应该抛出哪个异常呢?

一些相关的代码:

public class MyCustomAttribute : ActionMethodSelectorAttribute
{
    public bool Prop1 { get; set; }
    public bool Prop2 { get; set; }
    public bool Prop3 { get; set; }

    public MyCustomAttribute()
    {
        this.Prop1 = true;
        this.Prop2 = true;
        this.Prop3 = true;
    }

    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        // at least one of them must be true
        if (!this.Prop1 && !this.Prop2 && !this.Prop3)
        {
            throw new ?????
        }

        // other codez here
    }
}

属性有一个很棒的功能,既可以初始化它们,又可以提供属性值,因此我必须在IsValidForRequest方法中检查它们。

[MyCustom(Prop1 = false, Prop2 = false, Prop3 = false)]

应该抛出哪种异常?

3个回答

8

我会选择抛出InvalidOperationException,因为该操作对于对象的当前状态无效。


我更倾向于一些类似于“InvalidObjectStateException”的异常,如果有的话……但是“InvalidOperationException”看起来也不错。让我们看看是否还有其他想法。 - Robert Koritnik
1
这是.NET库中最常用的异常,在像这样的情况下使用(例如,当端口未打开时,请参见SerialPort.ReadChar)。 - John Arlen
1
我也会选择 InvalidOperationException,但每次使用它时,我总是想知道是否有更好的选择! - Danny Tuppeny

-1
你可以尝试使用ArgumentException,如果这些属性是从用户输入中加载的...或者你可以实现自己的自定义异常来抛出。
这真的取决于这些属性是如何设置的。

根据我的示例,它们不是通过构造函数参数设置的。我的构造函数是无参的,因为实际上我不需要参数。 - Robert Koritnik
2
除非问题出现在当前方法的参数中,否则不应使用“ArgumentException”。“当提供给方法的一个或多个参数无效时引发的异常。” - Danny Tuppeny
是的,但我实际上是指它们是否来自用户输入,还是计算字段或其他内容。异常的类型让程序员(以及随后的用户)了解问题产生的上下文。因此,理解这些属性的含义是抛出正确的异常类型很重要。 - PedroC88

-2
使用以下代码抛出带有您特定自定义消息的异常:
throw new Exception("Custom Error Message");

3
不建议抛出基类异常。如果您想这么做,请声明并抛出自定义异常。 - TrueWill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接