在这个问题之后: 避免!= null 语句 我问我们的一位高级开发人员为什么不使用断言。虽然他的回答被证明是合理的(我们使用自定义异常),但他还声称断言是在开发和测试时使用的,而不是在生产中使用的。
但是在 Oracle 的文档 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 中,断言似乎是为了在测试之外使用,甚至考虑到禁用它们的可能性。
那么,有没有更好的理由或良好的做法不使用断言?
在这个问题之后: 避免!= null 语句 我问我们的一位高级开发人员为什么不使用断言。虽然他的回答被证明是合理的(我们使用自定义异常),但他还声称断言是在开发和测试时使用的,而不是在生产中使用的。
但是在 Oracle 的文档 http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html 中,断言似乎是为了在测试之外使用,甚至考虑到禁用它们的可能性。
那么,有没有更好的理由或良好的做法不使用断言?
断言的行为因语言而异。在 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
是编程错误的文档。将其设为断言可以在启用断言时在运行时检测到错误。