C# 来自另一个方法的意外返回值异常
我正在寻找一个BCL异常类型,以防调用另一个方法时出现意外的返回值 我会把它命名为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
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
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的以下链接上了解更多信息