当参数对象的required属性为null时,应抛出哪个异常

时间:2011-07-08 14:22:02

标签: c# exception null

我使用参数对象来封装传递给我的业务规则的参数。使用上下文参数创建规则,然后可以修改该参数,然后在稍后执行规则。此对象的某些属性是必需的,否则该方法将抛出NullReferenceException。但是,如果我抛出ArgumentNullException,我会收到警告,说参数名称与我的某个参数不匹配。对于这种情况,什么是适当的例外?

public class GetAttributes : BusinessRuleBase 
{
    private readonly IGetAttributesContext _context;


    public GetAttributes(IGetAttributesContext context)
    {
        _context = context;
    }

    public override void Execute()
    {
        if (_context.AttributeModel == null)
        {
            //Exception would be thrown here
        }
        _context.Attributes = _context.AttributeModel
                                      .DoSomething(_context.EntityType);
    }
}

4 个答案:

答案 0 :(得分:2)

如果您使用的是代码合约,而且您愿意公开展示HasAttributeModel财产,我建议您

Contract.Requires(this.HasAttributeModel);

否则,您应该抛出一个源自InvalidOperationException的自定义异常。在给定对象的当前状态的情况下,您尝试执行的方法无效。来自文档:

  

当方法调用对象的当前状态无效时引发的异常。

您的自定义消息应该说实例的AttributeModelnull

更大的问题是,为什么你允许你的实例处于可以在对象处于无效状态时调用它们的方法的状态?如果可以的话,你应该避免这种情况。例如,为什么GetAttributes没有检查context.AttributeModel是不是null?你可能有

Contract.Requires(context.AttributeModel != null);

作为此方法的前提条件。但是,这里存在一些危险,如果有人保留对参数context的引用的实时引用,它们可能会破坏状态,因为您通过私有变量_context维护引用。请注意这一点,如果可以,请避免使用它。

答案 1 :(得分:1)

如果您认为某人可能想要捕获此特定异常并以与典型异常不同的方式处理它,请编写您自己的异常类。

理想情况下,您可以通过在(名称不详的)GetAttributes方法中检查此属性来获得快速失败的行为。在这种情况下,如果您没有使用自己的自定义异常类型,我会抛出ArgumentException

如果在早期检查此属性没有意义,并且您仍想使用系统异常类型,Jason是对的:使用InvalidOperationException

答案 2 :(得分:0)

使用您的自定义说明投放NullReferenceException,或创建自己的自定义例外。

InvalidArgumentException表示该参数无效,但在您的情况下没有参数,并且因为无效或有效,它必须不为空。

答案 3 :(得分:0)

您应该使用自定义异常来确保您真正捕获到异常,而不是系统生成的异常。