尝试使用空Catches

时间:2013-07-24 15:14:47

标签: java try-catch standards

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

实施例

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 个答案:

答案 0 :(得分:1)

这是不好的做法。

本身并没有不稳定性,但是对于空的捕获,没有对异常做任何事情,如果由于异常导致某些方面没有得到处理,这可能会使对象处于不一致状态。

话虽如此,空的catch块使调试非常困难。即使在生产代码中,您也应该为大多数例外提供基本的“通知”。

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

答案 1 :(得分:1)

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

答案 2 :(得分: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();

答案 3 :(得分:0)

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

你可以在这里阅读一篇关于处理例外的优秀文章:

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


我发现第二页特别有帮助。