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