我想知道当被调用的方法返回意外结果时,我应该抛出什么异常(在.NET中有什么)。
例如,想象一下我有工厂的情况:
public abstract class Factory
{
public A Create()
{
var a = new A();
var b = CreateDependencyOfA();
a.Something = b.Property;
}
protected abstract B CreateDependencyOfA();
}
我记录了该类,并创建了CreateDependencyOfA不返回null的假设(或其他任何内容,即假设该值介于1和5之间的整数)。
当实现破坏此契约时,我应该怎么做(在这种情况下返回null)。在.NET中是否有为此目的设计的任何异常类型?我知道有一些ArgumentExceptions,但据我所知,它们是输入参数。输出参数是否等效?
我问这个是因为我相信输入和输出参数之间存在某种对称性,但我不知道任何输出异常。
答案 0 :(得分:7)
如果方法返回一个永远不会返回的值,则表示程序中存在内部逻辑错误。这种错误(即代码设计为规范时必须永远不会发生的情况)最好由assertions处理:
var dependency = Factory.CreateDependencyOfA();
Debug.Assert(dependency != null, "Factory returned null dependency.");
注意:使用断言假定您正在检查自己方法的输出。换句话说,您拥有Factory
及其所有实现,您编写了所有CreateDependencyOfA
方法,并且您知道这些方法不能返回null
。
如果Factory
的实现是其他人编写的插件,则不应使用断言。相反,使用InvalidOperationException
表示当前状态(即提供给您的Factory
实现)无效。
答案 1 :(得分:1)
您可能需要查看代码合同:http://msdn.microsoft.com/en-us/library/dd264808(v=vs.110).aspx
例如,您的CreateDependencyOfA方法可能包含合同,例如:
Contract.Ensures(Contract.Result<B>() != null);