如果变量未在生产中启用,断言如何检查变量的有效性?

How does assertion check for validity of an variable, if it is not turned on in production?

我指的是这个post:What does the Java assert keyword do, and when should it be used?

我的理解是:断言有助于检查变量的有效性,如果检查失败,它会抛出一个AssertionError。并且此检查通常在生产中关闭。


问题1:为什么在生产中我们不需要检查参数的合法性?我的意思是,用户可以传入一个无效参数来故意破坏程序,对吧?

问题2:由于断言在生产中通常是关闭的,这是否意味着除了断言之外我还需要编写检查和抛出异常?

答案1:断言用于“验证代码中不变量的正确性”用户输入不是不变量。

答案 2:是的,但您可能应该删除断言,因为您可能没有检查不变量。

重点是您的用户可能希望您的应用程序健壮。当某些内部断言不成立时,他们不希望您的应用程序 消亡

换句话说:测试和生产在很多方面都不同;其中之一是错误的处理。测试人员可能希望快速失败;以及尽可能准确的错误信息。最终用户想要继续他正在做的任何事情;如果有的话;他想要一些他可以报告给你的错误代码。

因此:您仍然需要在代码中进行专门的错误处理;如果某些方法在 "bad" 输入时失败;那么它应该抛出相应的异常。然后其他一些组件应该捕获该异常并决定从那里做什么。换句话说:您可能根本不想使用断言。因为您想测试最终用户将使用的完全相同的产品。因此,有两种不同的错误处理方式并不是一个有用的模式。

断言用于验证您的代码假定为真的某些状态。

换句话说,如果断言失败,您的应用程序世界就会崩溃(或者可能只是一个错误)。

这与您可以处理的错误相反(即错误的用户输入)。

例如,假设您要求用户提供 phone 号码。如果 phone 数字格式错误,您 不应该断言 ,而是应该检查它并做出相应的响应(错误代码或显示错误消息)。

另一方面,假设您要将 phone 号码存储在数据库中。当您的应用程序加载时,您连接到数据库并从那里写入和读取它,假设连接是实时的。 如果您正在编写一个假设将 phone 数字存储在数据库中的方法,那么您不应该编写代码来检查数据库的连接,而是可以添加断言来检查连接是否有效。 这样在开发模式下,如果您曾经(出于某种原因)运行 遇到断言时数据库不可用的情况,您将拥有一个很好的可读堆栈跟踪。

经验的作用:你应该断言你传递的东西是正确的并且没有充分的理由不正确