C# 来自另一个方法的意外返回值异常

C# 来自另一个方法的意外返回值异常,c#,.net,exception,C#,.net,Exception,我正在寻找一个BCL异常类型,以防调用另一个方法时出现意外的返回值 我会把它命名为UnexpectedReturnValueException,但显然.NET Framework没有这样的名称 下面是一个代码示例来说明: public class SomeClass { private int savedMonth; private ISomeOtherClass other; public void DoSomething(int month, string val

我正在寻找一个BCL异常类型,以防调用另一个方法时出现意外的返回值

我会把它命名为
UnexpectedReturnValueException
,但显然.NET Framework没有这样的名称

下面是一个代码示例来说明:

public class SomeClass
{
    private int savedMonth;

    private ISomeOtherClass other;

    public void DoSomething(int month, string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentNullException("value");
        }

        if (!value.StartsWith("A"))
        {
            throw new ArgumentException("Value should always start with an 'A'", "value");
        }

        if (month < 1 || month > 12)
        {
            throw new ArgumentOutOfRangeException("month", "Month should be in range of 1 to 12");
        }

        if (savedMonth == month)
        {
            throw new InvalidOperationException("Provided month should be different from saved month");
        }

        var result = other.GetResult();

        if (result == null)
        {
            throw new ??? // What should I throw here?
        }

        // do other work here

    }
}

public interface ISomeOtherClass
{
    SomeOtherClassReturnValue GetResult();
}

public class SomeOtherClassReturnValue
{
}
公共类SomeClass
{
私人整数保存月数;
私人或其他类别;
公共void DoSomething(整月,字符串值)
{
if(string.IsNullOrEmpty(value))
{
抛出新的ArgumentNullException(“值”);
}
如果(!value.StartsWith(“A”))
{
抛出新ArgumentException(“值应始终以“A”开头”,“值”);
}
如果(月<1 | |月>12)
{
抛出新ArgumentOutOfRangeException(“月”,“月应在1到12之间”);
}
如果(savedMonth==月份)
{
抛出新的InvalidOperationException(“提供的月份应与保存的月份不同”);
}
var result=other.GetResult();
如果(结果==null)
{
扔新的???//我应该扔什么?
}
//在这里做其他工作
}
}
其他类的公共接口
{
SomeOtherClassReturnValue GetResult();
}
公共类SomeOtherClassReturnValue
{
}
重要: 根据我对MSDN的理解,以下例外情况不适用于此处:

  • ArgumentException
    -当提供给方法的一个参数无效时引发的异常
  • ArgumentNullException
    -将空引用传递给不接受它作为有效参数的方法时引发的异常
  • ArgumentOutOfRangeException
    -当参数值超出调用方法定义的允许值范围时引发的异常
  • InvalidOperationException
    -方法调用对对象当前状态无效时引发的异常
如果null值是异常的,因此需要异常,那么最好的内置类型是
InvalidOperationException

正如作者所说,错误并不是直接由方法参数引起的,因此没有任何参数*-异常适用于这种情况

SomeClass
ISomeOtherClass other
作为类中的私有成员,并且方法调用方不能对其具有任何可见性<代码>IsoOtherClass-依赖关系是对象内部状态的一部分。如各国所述:

当方法调用对无效时,将引发InvalidOperationException 对象的当前状态

InvalidOperationException用于调用失败的情况 方法是由无效参数以外的原因引起的


如果
other.GetResult()
的编写方式可以返回null,那么这怎么会出乎意料呢?显然,这种情况并不常见,无法保证内置异常类型。您可以创建自己的异常类型并抛出该异常。@Szymon,由于
SomeClass
只是在使用
other
,它可以以抛出异常的形式提供其期望值。例如,假设
other
是一个返回
字符串的Guid生成器。在这种情况下,我们有权期望值不为null。我们通过检查返回值并抛出
UnexpectedResultException
而不是在使用此值时获取
NullReferenceException
或尝试将其添加到字典时获取
ArgumentNullException
来用代码表示它,例如@500 InternalServerError,这是正确的,我自己的异常类型始终是一个选项。但是我有一种感觉,在这种情况下,应该有一些被认为是“最佳实践”:)If other.GetResult();将返回空值作为正常行为,您应该在程序的自然流中处理它,而不是异常。您的输入测试也是如此。我建议使用bool/string返回值,不要抛出异常。您可以在MSDN的以下链接上了解更多信息