c# – 什么是条件后异常?

c# – 什么是条件后异常?,第1张

概述我正在做一些有问题的作业: 您如何处理先决条件异常? 你会如何使用条件后例外? 因此,对于第一个问题,我假设必须满足前提条件才能运行函数.例如,参数不能为null,我们可以抛出异常: if (myArg == null) throw new ArgumentNullException("myArg");//do work here 但是,我无法弄清楚后置条件异常的用途是什么,以及为什么我 我正在做一些有问题的作业:

您如何处理先决条件异常?
你会如何使用条件后例外?

因此,对于第一个问题,我假设必须满足前提条件才能运行函数.例如,参数不能为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# – 什么是条件后异常?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1220760.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存