在代码中使用断言,而不仅仅是在测试中
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".
我明白,断言在测试中用于检查程序员的前置条件和 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".