尝试使用空的捕获

gca*_*ex5 5 java standards try-catch

假设我有一个 try 语句和空 catch 是不好的做法吗?例如,说我有 2 次单独的尝试,其中一个可能失败但另一个成功或两者都成功或任何可能的组合。处理这样的代码是不好的做法吗?

例子

if( mode == Modes.EDIT ){
  try {user = userBo.findById(id).get(0); }
  catch(Exception e) { }
  try{
    result = this.initializeEntityById(accountDao, id);
    if( !result.equals(SUCCESS) ){
      return result;
    }   
  }
  catch(Exception e){ }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,关注的变量是“id”,我不确定传入的值是否有效,在前端它并不重要,因为代码处理传入的任何内容并提供正确的显示。

所以问题真的是:

  1. 这是空渔获物的不良做法吗?
  2. 是否存在我没​​有意识到的潜在不稳定性?
  3. 有没有更好的方法来实现我想要的?

Viv*_*ath 3

  1. 是的,这总是不好的做法,因为你不知道哪里出了问题。您至少应该记录异常。
  2. 不稳定性在于,当出现问题时,您不知道代码出了什么问题。
  3. 将异常用于控制流是不可取的。性能非常糟糕,异常只能在特殊情况下使用。您可以执行以下操作:
    1. 将异常作为方法签名的一部分,并让更高级别处理它。
    2. 捕获异常,但将其包装在语义上适当的异常中并重新抛出它,以便更高级别可以处理它。
    3. 处理它。这也可以通过多种方式完成:
      1. 不要让异常发生:不是捕获异常,而是对数据进行检查以查看是否会导致异常。例如,在您的情况下,我认为您应该有一个类似的方法userBo.existsWithId(id),该方法将返回一个boolean表示用户是否存在的方法。或者如果找不到用户则findById返回,并检查是否。我认为这是你最好的选择。nulluser == null
      2. 以某种理智的方式从异常中恢复(取决于您的业务逻辑)。

  • 这并不*总是*坏。如果你想返回一个固定的日期,Java会让你捕获一个永远不会发生的异常:`return new SimpleDateFormat("yyyy-MM-dd").parse("2999-12-31");` (2认同)