在代码中使用断言,而不仅仅是在测试中

Using Assertions in code not just in tests

我明白,断言在测试中用于检查程序员的前置条件和 post- 条件是否为真,如果断言失败,is/are bug/bugs 需要调试并修复。

断言是一种软件构造,开发人员在其中陈述 ("asserts") 他认为永远为真的条件。如果条件在某些语言中评估为 false,则会抛出异常,在其他语言中会打印一条消息,而在其他语言中,程序会停止运行。

上面定义中突出显示的

"A message is printed" 引起了我的注意。

我的问题是,我们能否在实际代码本身中扩展 assert 语句的使用并捕获 AssertionErrors 以记录消息而不仅仅是测试? 基本上是为了避免 if-else 语句过于冗长(顺便说一句,我个人讨厌 if-else)。 例如,以下所有

String response = aMethod(sendSomething);
if (response!=null && response!="") {
  //blah blah
} else { 
  log.error("Response is null");
  throw new NoDataFoundException();
}

可以替换为提供更详细消息的以下内容。

try{
   assertThat(aMethod(sendSomething), notNullValue());
} catch (AssertionError e) {
   log.error(e.getMessage());
}

您不想捕获断言失败(*)。根据定义,该程序在其设计范围之外运行。唯一安全的事情就是出去。

(*) 好的,如果捕获它的目的是记录您预期诊断问题所需的任何内容,那么您可以捕获它,然后快速退出。

在您的示例中,似乎在测试响应并记录失败后,您将继续内联。一般来说,这不是一个好主意,但也许这只是您的一个简单说明,不应过于照字面意思理解。

至于我认为您的总体观点:是的,如果您要检查 pre/postconditions,请将支票留在运输代码中。

我的代码如下所示:

  response = aMethod(sendSomething);
  if (response == null || response.isEmpty())
     throw new InternalError("....");

并且在最外层会有一些东西捕获错误,异常处理的一个点是你可以将控制转移到很远的地方,而不是必须在它发生的时候处理所有的事情——尤其是如果"it can't happen".