2012-09-29 288 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