您如何处理先决条件异常?
你会如何使用条件后例外?
因此,对于第一个问题,我假设必须满足前提条件才能运行函数.例如,参数不能为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-合同可以在编译后立即验证.
总结以上是内存溢出为你收集整理的c# – 什么是条件后异常?全部内容,希望文章能够帮你解决c# – 什么是条件后异常?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)