当前位置: 首页 > 知识库问答 >
问题:

断言可以在生产中使用,还是只能在开发时使用?

姜玉泽
2023-03-14

以下问题:避免!=空语句我问我们的一位高级开发人员为什么不使用断言。虽然他的回答被证明是合理的(我们使用自定义异常),但他也声称断言是在开发和测试时使用的,而不是在生产中使用的。

但在甲骨文的文档中http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html看起来断言的使用超出了测试范围,甚至考虑到禁用它们的可能性。

那么,有没有更好的理由或良好实践不使用断言?

共有1个答案

慕容嘉熙
2023-03-14

断言的行为因语言而异。在C语言中,它们经常被错误地使用,错误的用法非常普遍,以至于许多人建议根本不要使用它们。它们不应该用于生产(即,C的生产编译应该为预处理器定义NDEBUG),因为它们只会降低执行速度。

断言的目的是陈述逻辑上的必要性,而不是检查结果。例如,正确的做法是(在C中)写入:

f = malloc( s );
if( f == NULL ) {
   ...; exit( 1 );
}
assert( f != NULL );   # This is logically necessary.

但完全错误的曾经写:

f = malloc( x );        # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert( f != NULL );    # DO NOT DO THIS

这实际上很有用,因为它完全可以用来写:

f = xmalloc( x );
assert( f != NULL ); 

它作为读者的文档,说明xmalloc的定义方式永远不会返回空值。

它们通常在函数开始时使用:

void f( void *p ) { assert( p != NULL ); ... }

这种用法不是错误检查。相反,它用于指示函数f期望它永远不会被传递空指针。留档给开发人员的是,将空指针传递到f是一个编程错误。将其设置为断言可以在启用断言时在运行时检测到错误。

 类似资料:
  • 问题内容: 我一直在使用babel-node和带有babelify转换的browserify开发站点,以支持ES6语法。 我只是想知道,我是否可以在生产环境中运行它, 而不是 在节点中运行ES6还需要其他哪些选项? 这是我正在运行的用于构建和开始开发的命令 这是我的开发依赖 问题答案: 对于客户端代码 ,您正在做正确的事情。并将其运送给客户。 对于服务器端代码 ,我将使用babel- cli 进行

  • 我有两门课: 还有我的测试: 我希望它能通过,因为解包装可选,将转换为,在最后一个方法中,我只是比较字符串。 但它在最后一行失败了: 我不知道为什么可选包装没有打开

  • 问题内容: 通常,Android应用程序是用Java编写的。但是我听说也可以使用Scala或其他语言。而且我还读到,可以包含本机C / C ++代码。 是否有可用的推荐人/清单显示可以使用的语言? 问题答案: 在发布时,它是用于构建可分发的第三方Android软件的唯一官方支持的编程语言。 Android Native Development Kit(Android NDK),开发人员可以使用和构

  • 我有两台机器localhost和192.168.1.110来运行两台独立的单机kafka。 kafka2.11-0.10.0.0 bin/kafka-console-producer.sh--broker-list 192.168.1.110:9092--topic test这是一条消息[2016-08-24 18:15:27,441]错误将消息发送到topic test时出错,关键字:null,

  • 我有一个webservice操作,其中我将获得SAML断言作为请求体的一部分。我跟踪XSD: saml:断言是指:< br>

  • 试图看到一个在Cucumber中使用软断言的工作示例。我有以下简单的特性和步骤定义,我故意使一些验证失败,但cucumber测试仍然显示“通过”。我是不是做错什么了。 @给定(“^I have a Scenary for Soft Assert$”)public void i_have_a_scenario_for_soft_assert()throwsable{