5

假设我有一个带有空捕获的 try 语句,这是不好的做法吗?例如,假设我有 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){ }
}

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

所以问题真的是:

  1. 这是空接球的坏习惯吗?
  2. 是否有任何我没有意识到的潜在不稳定性?
  3. 有没有更好的方法来实现我想要的?
4

4 回答 4

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

1) Is this a bad practice with the empty catch's?

是的,这不是一个好习惯。

2) Is there any potential instability that could occur that I'm not realizing?

如果您出现任何问题并引发任何异常,那么您将无法确定出了什么问题,因为在 catch 块中您没有做任何事情,因此假定它已被处理。

3) Is there a better way to achieve what I'm looking to get at?'

尝试将异常堆栈跟踪记录在catch block. 或者再扔一次

e.g. e.printstacktrace();
于 2013-07-24T15:18:15.623 回答
1

这是不好的做法。

本质上没有不稳定性,但是对于空捕获,没有对异常进行任何处理,如果某些方面由于异常而没有得到处理,这可能会使对象处于不一致的状态。

话虽如此,空的 catch 块使调试变得非常困难。即使在生产代码中,您也应该包含针对大多数异常的基本“通知”。

在测试代​​码中,e.printStackTrace(在每个不执行任何操作的 catch 块中使用。

于 2013-07-24T15:17:03.290 回答
0

是的,这是不好的做法。
如果抛出异常,则应该以某种方式对其进行处理,并且 catch 块用于保存处理代码。至少,如果您的方法中不需要恢复代码和备用逻辑来处理捕获的异常(这种情况很少见),您应该记录异常以便知道它发生了。

您可以在此处阅读有关处理异常的优秀文章:

http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html?page=2


我发现第二页特别有用。

于 2013-07-24T15:19:33.503 回答