assert
不是处理异常的方法,而是检测异常的方法。(因此,您找到的描述对我来说似乎有点离题。)这基本上是一种说法:
这应该是真的。如果不是,则抛出错误。
您如何处理该错误是一个完全不同的问题。你可以在检测到它的函数中处理它,你可以在调用它的函数中处理它,你可以在应用程序级别的堆栈的最顶部处理它,等等。
请记住,捕获异常(这是正在使用的编程语言的构造)和有意义地处理异常(这是独立于所使用的语言的逻辑构造)之间存在显着差异。仅捕获您可以实际对其进行处理的异常。否则,让他们将堆栈冒泡到可以对他们做某事的其他代码。(但由于assert
不会捕获错误,它会抛出错误,因此应该在您尝试使用它的确切位置使用它......可以检测到错误的点,即使它无法处理。)
看看你尝试使用assert
,看起来你很接近。这不是真正正确的用法:
assert (x > 0) ? "assertion failed" : "assertion passed";
您将其assert
视为布尔值。然后,使用? :
运算符,您将关闭该布尔值以...好吧...实际上不做任何事情。只需将字符串 ("assertion failed"
或"assertion passed"
) 返回到对该字符串不执行任何操作的代码行。
关闭,但不完全。
它assert
本身所做的不仅仅是检查一个条件。它通过抛出错误或允许代码路径继续来响应条件。它使用:
运算符,但不作为? :
运算符的一部分。所以我认为你想要做的是:
assert (x > 0) : "assertion failed";
这基本上是在说:
x 应始终大于 0。如果不是,则说明有问题。停止做任何事情并引发错误。
这将引发一条AssertionError
带有消息的消息"assertion failed"
(当然,您希望将其替换为更有意义和有用的消息,包括有关正在检查的值的任何有用的运行时信息,以帮助您进行调试)。
然后,在其他地方,你会处理它AssertionError
并以某种方式回应它。
使用assert
与这样的东西非常相似,只是更短且更能表达其意图:
if (x <= 0) throw new CustomException("assertion failed");
正如你所看到的,assert
它只是更干净一点:
- 使用特定关键字来提醒人们注意它检查条件的唯一目的是验证假设。An
if
可能正在这样做,或者它可能出于任何其他原因分叉一条新的代码路径。
- 引发特定错误,可以将其与其他错误分开。请注意我使用 a
CustomException
来做同样的事情,但AssertionError
更常见/预期。
- 使用更少的代码。
- 演示真实条件,而不是相反或错误的条件。在大多数情况下,真实条件更容易阅读,并且更清楚地表达了代码的意图。
- 遵循惯例并且更惯用。
- 将代码与其他代码区分开来,以用于特定目的,向其他开发人员表明断言应该只是一个断言。(因此其他开发人员不应该将其修改为第二个代码路径,可能会给断言添加副作用。)
- 可以很容易地为正在运行的应用程序全局打开或关闭。Java 允许您在任何给定的运行时上下文中启用或禁用断言检查。这对于将断言作为横切关注点进行全局管理非常方便。