【问题标题】:throwing exception inside the catch block在 catch 块内抛出异常
【发布时间】:2012-09-21 01:59:09
【问题描述】:
    public void onClick() throws SQLException   
  try {
 // Do something
} catch(MySQLIntegrityConstraintViolationException e) { 
     //Can i convert this exception to SQL Exception
}

我可以将 MySQLIntegrityConstraintViolationException 转换为方法抛出的 SQLException 吗?

【问题讨论】:

    标签: java mysql exception


    【解决方案1】:

    当然,您可以换行并重新抛出 - 如果您认为它增加了更多信息或使您的想法更笼统。我认为在这种情况下,您捕获的异常提供的信息比您考虑的要多。

    不过,我不会选择 SQLException。这是一个检查异常。我认为潮流已经从受检异常转变为不受检异常。

    Spring 将 SQLExceptions 包装到扩展 RuntimeException 的未经检查的 DataAccessException 中。我建议你效仿。

    你应该这样做:

    catch(MySQLIntegrityConstraintViolationException e) { 
        throw new SQLException(e);
    }
    

    不要只是传递信息。给出整个堆栈跟踪。

    【讨论】:

    • 你是绝对正确的(“不要只是传递信息......”),但请参阅我的更新答案。
    【解决方案2】:

    但是 MySQLIntegrityConstraintViolationException 已经一个 SQLExecption(通过继承)!所以没有必要重新抛出它(只需删除 try/catch 块)。

    【讨论】:

    • 好点。我可以看到包装它的唯一原因是隐藏它是 MySQL 的事实或使用自定义异常层次结构。但即便如此,我也会说这并不重要。人们多久更换一次数据库?你更有可能重写中间层。我现在赞成你的回答。
    • @duffymo - 是的,当然,另一个不只是传递 SQLException 的原因是如果有更多的 catch 子句和其他异常处理 - 但这在 OPs 问题中不存在。
    【解决方案3】:

    您可以使用SQLException 的构造函数在您的Catch 块中创建一个..

    try {
    } catch (MySQLIntegrityConstraintViolationException e) {
        throw new SQLException(e);
    }
    

    【讨论】:

    • 我认为这不是要走的路。通过原始异常。
    • @duffymo。也可以这样做..但这也没有错..我还是会编辑它..
    • 我没说做不到。我说这不是要走的路。请参阅我上面的代码。它将更多信息返回给处理程序类 - 堆栈跟踪。
    • @duffymo.. 是的,你是对的.. 这就是我更新答案的原因.. :)
    【解决方案4】:

    由于MySQLIntegrityConstraintViolationExceptionSQLException 的子类,因此不需要重新抛出。如果您想从数据库特定细节中抽象出业务逻辑层,请确保在逻辑层中捕获 SQL 异常,以便即使数据库切换逻辑仍然有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多