2012-09-29 119 views
0
public void onClick() throws SQLException 
    try { 
// Do something 
} catch(MySQLIntegrityConstraintViolationException e) { 
    //Can i convert this exception to SQL Exception 
} 

我可以将MySQLIntegrityConstraintViolationException转换为该方法抛出的SQLException吗?在catch块内抛出异常

回答

3

确定你可以包装和重新抛出 - 如果你认为它增加了更多的信息或使你的想法更一般。我认为在这种情况下,你所捕捉到的异常比你想的更多。但是,我不会选择SQLException。这是一个检查的例外。我认为潮流已经从检查转向非检查的例外。

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

这里是你应该怎么做:

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

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

+0

你绝对正确(“不要只是传递信息......”),但看到我更新的答案。 –

4

但MySQLIntegrityConstraintViolationException已经 SQLExecption(通过继承)!所以不需要重新抛出它(只需删除try/catch-block)。

+0

优秀点。我能看到的唯一理由就是隐藏它在下面的MySQL或使用自定义异常层次结构的事实。但即使如此,我会说这并不重要。人们多久更换一次数据库?这很可能会改写中间层。我现在提出了你的答案。 – duffymo

+1

@duffymo - 是的,绝对不会只是通过SQLException的另一个原因是,如果有更多的catch-clause和其他异常处理 - 但这不是OP中的问题。 –

1

您可以使用SQLException的construtor创建一个在你的Catch块..

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

我认为这不是要走的路。通过最初的例外。 – duffymo

+0

@duffymo。这也可以完成..但是这也是没有错的..仍然我会编辑它.. –

+0

我没有说它不能完成。我说这不是要走的路。看到我上面的代码。它将更多信息返回给处理程序类 - 堆栈跟踪。 – duffymo

1

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

+0

+1 - 很好的答案。 – duffymo