首页 > 解决方案 > C#:当不支持参数类型时,我应该抛出 ArgumentException 还是 NotSupportedException?

问题描述

所以,我遇到了需要抛出异常的情况,因为“不支持参数”。为了解释我是如何到达这里的,这是一个粗略的情况:

代码示例:

public abstract class Ook
{
    public abstract bool TryBefriendYook(Yook yook);
    public abstract bool TryBefriendZook(Zook zook);

    public bool TryBefriend(Ook o0k)
    {
        Type ookType = ook.GetType;

        if (ookType == typeof(Yook))
        {
            TryBefriendYook((Yook)ook);
            return true;
        }
        else if (ookType == typeof(Zook))
        {
            TryBefriendZook((Zook)ook);
            return true;
        }
        else return false;
    }

    public void Befriend(Ook ook)
    {
        if(!TryBefriend(ook))
            throw new Exception(
                "argument type not supported");
    }
}

public sealed class Yook : Ook
{
    public override bool TryBefriendYook(Yook yook)
    {
        return true;
    }
    public override bool TryBefriendZook(Zook zook)
    {
        return true;
    }
}

public partial sealed class Zook : Ook
{
    public override bool TryBefriendYook(Yook yook)
    {
        return false;
    }
    public override bool TryBefriendZook(Zook zook)
    {
        return true;
    }
}

所以,这种类型既属于ArgumentException(论点不适合子类)和NotSupportedException(子类不接受论点),不是吗?

那么,我应该选择哪一个 - 或者我应该为这种情况编写一个自定义异常?

标签: c#polymorphismcustom-exceptionsargumentexceptionnotsupportedexception

解决方案


你不应该抛出任何异常。你已经声明了这个方法:

public bool TryBefriend(Ook o0k)

它说这个方法需要一个 type 的参数Ook。如果有人传递了一个属于该类型或其子类之一的参数,并且它可以编译,那么给他们一个运行时错误并说,实际上,“不,不是那种类型。我真的是这个意思类型和这种类型,但不是那种类型。”

如果可以尝试与某事成为朋友,但结果是它可能成功也可能不成功,那么尝试不应该抛出异常。我们不应该使用异常来管理正常的、可预测的程序流。

把它想象成试图从银行取钱。如果您尝试提取 1000 美元,您应该会收到一条消息说成功或失败,因为您没有 1000 美元。如果你有足够的钱,它不应该返回成功,如果你没有,它不应该抛出异常。没有足够的钱是正常的,可预测的可能性。另一方面,如果应用程序无法继续,因为它失去了数据库连接并且无法恢复,那么抛出异常是有意义的。

所以我只是返回trueor false,然后调用者可以根据响应决定做什么。你会看到这个,这是有道理的:

if(someOok.TryBefriend(someOtherOook))
{
    // friends!
}
else
{
    // not friends!
}

...而不是这个,这很尴尬:

try
{
    someOok.TryBefriend(someOtherOook);
    // friends!
}
catch(NotSupportedException ex)
{
    // not friends!
}

推荐阅读