C# 什么是后条件异常?

C# 什么是后条件异常?,c#,exception,conditional-statements,post-conditions,C#,Exception,Conditional Statements,Post Conditions,我正在做一些有问题的家庭作业: 如何处理前置条件异常? 如何使用post条件异常? 所以对于第一个问题,我假设一个前提条件是必须满足才能运行函数。例如,参数不能为null,我们可以抛出异常: if (myArg == null) throw new ArgumentNullException("myArg"); //do work here 但是,我无法理解post条件异常的用途,以及在这种情况下为什么要抛出异常(例如,如果不满足条件,则不返回false) 有人能举个例子吗 后置条件是

我正在做一些有问题的家庭作业:

如何处理前置条件异常?
如何使用post条件异常?

所以对于第一个问题,我假设一个前提条件是必须满足才能运行函数。例如,参数不能为null,我们可以抛出异常:

if (myArg == null)
    throw new ArgumentNullException("myArg");
//do work here
但是,我无法理解post条件异常的用途,以及在这种情况下为什么要抛出异常(例如,如果不满足条件,则不返回false)


有人能举个例子吗

后置条件是一段代码(如方法或函数)在函数退出时给出的状态的保证,如返回值的正确性,或更广泛状态的正确性,如类实例或甚至整个程序的状态

我将
Post-Condition异常
解释为抛出异常的操作(直接使用
throw
,或使用保护
Assert
),而不仅仅是软返回失败的返回代码或默认值,调用方可能不会检查这些值

硬故障在检查前置条件、后置条件和不变量时至关重要,因为调用方需要检查软返回(如false、0或-1等幻值),并掩盖代码在非设计状态下运行的实际问题

下面的示例希望说明使用异常的post条件。在我对
Square(x)
的简化设计中,如果输入的契约有效(即输入数squared不会溢出),函数应该保证结果是正数。如果post条件检查失败,则表示我的设计/实现中存在缺陷,可能会产生可怕的后果(例如,未考虑到的场景,或依赖项失败,如
数学
库本身)

例外情况的例子:

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;
}

与基于异常的断言相比,代码契约的另一个优点是——契约可以在编译后立即进行验证。

另一个答案是正确的,注释在回答您的问题时都很有用。我觉得还有一点可以补充,所以这里是我的贡献

我也从来没有听说过它被称为“后条件异常”,但关于你的问题,“它们什么时候被使用”,它们在单元测试中被大量使用(有关如何使用的信息,请参阅或其他资源,如wikipedia)。在单元测试中,测试程序员调用她想要测试的函数,并且她也知道她期望从函数中得到什么值(也就是说,从其他知识来源知道的正确答案)。后条件测试是:“函数或方法返回的预期值和实际值是否一致?”

如果他们不同意,Assert方法就会抛出一个异常。测试框架软件捕获异常,然后将给定的测试报告为失败,并继续运行其他测试,而不会停止失败的测试。下面是一个玩具的例子来说明

[TestMethod]
public void Integers_7Add1_equals8()
{
   int expected = 8;
   int actual = MyClass.AddOne(7);
   Assert.AreEqual(expected, actual);
}

因此,在调用被测试的方法之后,在Assert.AreEqual方法调用中抛出异常,因此它是一个post条件异常。

C#没有本机的前置/后置条件-但是,请参阅:代码契约提供了一种在代码中指定前置条件、后置条件和对象不变量的方法。先决条件是输入方法或属性时必须满足的要求。后置条件描述方法或属性代码退出时的期望。对象不变量描述处于良好状态的类的预期状态。“我已经编辑了您的标题。请参见,”,其中的共识是“不,它们不应该”。至于“为什么”,我认为从像埃菲尔这样的语言的观点来看,这是最根深蒂固的:(作者Bertrand Meyer写了几篇论文并教授这方面的知识。)我从来没有听说过“后条件例外”这个词。你从哪里得到的“是行业中常用的术语。回答得好,这可能是我们在我的类中进行单元测试后出现异常的原因之一-我只是不认为Assert.AreEqual()是post条件异常,但当你想到它时,它基本上就是这样做的。谢谢。+1
[TestMethod]
public void Integers_7Add1_equals8()
{
   int expected = 8;
   int actual = MyClass.AddOne(7);
   Assert.AreEqual(expected, actual);
}