问题

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

例如,

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 热门回答(155 赞)

出于我的想法(列表可能不完整,并且太长而无法容纳评论),我会说:

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

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

断言的编写成本很低,几乎可以在任何地方使用它们而且我正在使用这个经验法则:断言语句看起来越愚蠢,它越有价值,嵌入的信息就越多。在调试不正常的程序时,你一定会根据你的经验检查更明显的故障可能性。然后你将检查那些不可能发生的问题:这正是断言有助于节省时间的时候。


#2 热门回答(73 赞)

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

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

断言会阻止程序运行,但异常会让程序继续运行。

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


#3 热门回答(24 赞)

请记住,可以在运行时使用参数和are disabled by default禁用断言,因此除了调试目的之外,不要依赖它们。

另外你应该阅读Oracle article about assert以查看更多使用 - 或不使用 - 断言的情况。


原文链接