【问题标题】:Which exception should be thrown?应该抛出哪个异常?
【发布时间】:2011-02-28 17:48:51
【问题描述】:

我编写了一个自定义操作方法选择器属性,它具有三个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)]

应该抛出哪个异常?

【问题讨论】:

    标签: c# asp.net-mvc exception


    【解决方案1】:

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

    【讨论】:

    • 如果有的话,我更喜欢某种InvalidObjectStateException……但InvalidOperationException 似乎还不错。让我们看看有没有其他想法。
    • 这是 .NET 库最常使用的异常,在这种情况下(例如,请参阅端口未打开时的 SerialPort.ReadChar)。
    • 我也想用InvalidOperationException,虽然每次用都想知道有没有更好的!
    【解决方案2】:

    如果这些属性是从用户输入加载的,您可以尝试使用ArgumentException...或者您可以实现自己的custom exception 来抛出。

    这真的取决于这些属性是如何设置的。

    【讨论】:

    • 按照我的例子。它们不是通过构造函数参数设置的。我的构造函数是无参数的,因为我实际上不需要参数。
    • ArgumentException 不应使用,除非问题出在当前方法的参数上。 “当提供给方法的参数之一无效时引发的异常。”
    • 是的,但我实际上的意思是它们来自用户输入还是计算字段或其他东西。异常的类型使程序员(以及随后的用户)了解问题出现的上下文。因此,属性的含义对于抛出正确的异常类型很重要。
    【解决方案3】:

    使用您的特定自定义消息引发异常

    throw new Exception("Custom Error Message");
    

    【讨论】:

    • 不推荐抛出基类异常。如果你想走那条路,声明并抛出一个自定义异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2010-11-28
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多