c# – 什么是条件后异常?
我正在做一些有问题的作业:
您如何处理先决条件异常? 因此,对于第一个问题,我假设必须满足前提条件才能运行函数.例如,参数不能为null,我们可以抛出异常: if (myArg == null) throw new ArgumentNullException("myArg"); //do work here 但是,我无法弄清楚后置条件异常的用途是什么,以及为什么我们希望在这种情况下抛出异常(例如,如果不满足条件,则不要返回false). 有人可以为此提供一个例子吗? 解决方法
后置条件是保证一段代码(例如方法或函数)给出退出函数时的状态,例如返回值的正确性,或更广泛状态的正确性,例如状态类实例甚至整个程序.
我会将后置条件异常解释为抛出异常的行为(直接使用throw,或者使用保护断言),而不是仅仅轻轻地返回失败的返回代码,或者默认值,这可能不会被呼叫者,召集者. 在检查前置条件,后置条件和不变量时,硬故障是至关重要的,因为调用者需要检查(并且可能会错过)软返回(例如像false或0或-1这样的魔术值)并掩盖代码在设计外状态下运行的真正问题. 以下示例有望说明使用异常的后置条件.在我对Square(x)的简单设计中,只要输入上的契约有效(即输入数字的平方不会溢出),函数应该保证结果是正数.如果后期条件检查失败,则意味着我的设计/实现中存在可能产生可怕后果的缺陷(例如,未考虑的情况,或依赖性的失败,例如在Math库本身中). 示例有例外: public static double Square(double number) { // Pre condition if (Math.Abs(number) > Math.Sqrt(double.MaxValue)) throw new InvalidArgumentException("Number too big - will overflow"); var result = number * number; // Post condition if (result < 0) throw new Exception("Square(x) should always be positive!"); return result; } 根据评论,Code Contracts还允许通过Contract.Ensures指定发布条件.这样做的好处是,在方法的顶部记录了pre和post条件,并且还避免了对额外局部变量的需要,因为结果可以直接“检查”: public static double Square(double number) { Contract.Requires(Math.Abs(number) < Math.Sqrt(double.MaxValue),"Oops number will result in overflow"); Contract.Ensures(Contract.Result<double>() >= 0,"Square should always be positive!"); return number * number; } Code Contracts相对于基于异常的断言的另一个优点是static checking-合同可以在编译后立即验证. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |