当方法返回无效结果时,我应该抛出什么异常

本文关键字:我应该 什么 异常 方法 返回 无效 结果 | 更新日期: 2023-09-27 18:25:27

我想知道当被调用的方法返回意外结果时,应该抛出什么异常(.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中是否有专门为此目的设计的异常类型?我知道有一些ArgumentException,但据我所知,它们适用于输入参数。输出参数是否等效?

我之所以这么问,是因为我相信输入和输出参数之间存在某种对称性,但我不知道输出有任何例外。

当方法返回无效结果时,我应该抛出什么异常

如果一个方法返回了一个永远不应该返回的值,则表示程序中存在内部逻辑错误。这类错误(即,如果代码是按照规范设计的,则永远不会发生的情况)最好通过断言来处理:

var dependency = Factory.CreateDependencyOfA();
Debug.Assert(dependency != null, "Factory returned null dependency.");

注意:断言的使用假设您正在检查自己方法的输出。换句话说,您拥有Factory及其所有实现,您编写了所有CreateDependencyOfA方法,并且您知道这些方法不能返回null

Factory的实现是由其他人编写的插件,则不应该使用断言。相反,使用InvalidOperationException来指示当前状态(即提供给您的Factory实现)无效。

您可能需要签出代码合约:http://msdn.microsoft.com/en-us/library/dd264808(v=vs.110).aspx

例如,您的CreateDependencyOfA方法可能包括一个合约,例如:

Contract.Ensures(Contract.Result<B>() != null);