何时使用断言以及何时使用异常

2022-08-31 08:19:06

大多数时候,我会使用异常来检查代码中的条件,我想知道什么时候是使用断言的适当时机?

例如

Group group=null;
try{
    group = service().getGroup("abc");
}catch(Exception e){
    //I dont log error because I know whenever error occur mean group not found
}

if(group !=null)
{
    //do something
}

您能指出一个断言如何适合这里吗?我应该使用断言吗?

似乎我从不在生产代码中使用断言,只在单元测试中看到断言。我确实知道在大多数情况下,我可以使用异常来执行上述检查,但我想知道“专业”进行检查的适当方法。


答案 1

在我的脑海中(列表可能不完整,并且太长而无法放入评论中),我会说:

  • 检查传递给公共或受保护方法和构造函数的参数时使用异常
  • 在与用户交互时或当您期望客户端代码从异常情况中恢复时,使用异常
  • 使用异常来解决可能发生的问题
  • 在检查私有/内部代码的前提条件、后置条件和不变量时使用断言
  • 使用断言为自己或开发团队提供反馈
  • 在检查不太可能发生的事情时使用断言,否则这意味着您的应用程序中存在严重缺陷
  • 使用断言来陈述你(据说)知道是真实的事情

换句话说,异常解决应用程序的健壮性,而断言解决其正确性。

断言被设计成写起来很便宜,你几乎可以在任何地方使用它们,我使用这个经验法则:断言语句看起来越愚蠢,它就越有价值,它嵌入的信息就越多。在调试行为不正确的程序时,您一定会根据您的经验检查更明显的故障可能性。然后,您将检查无法发生的问题:这正是断言帮助很大并节省时间的时候。


答案 2

断言应该用于检查不应该发生的事情,而异常应该用于检查可能发生的事情。

例如,函数可能被 0 除,因此应使用异常,但可以使用断言来检查硬盘驱动器是否突然消失。

断言将停止程序运行,但异常将允许程序继续运行。

请注意,这不是一个断言,这只是一个有条件的。if(group != null)