2012-01-15 33 views
1

我正在閱讀一本Spring書籍來學習Spring。經歷了關於JDBCTemplate的部分,我驚訝地發現Spring不同地處理大多數SQLException異常。Spring在JDBC模板中執行異常處理

例如,所有檢查的異常都轉換爲未經檢查的異常。這究竟有什麼好處?

根據我的經驗,大部分SQL異常都應該被處理。例如,我們有一個與Oracle PL/SQL過程交談的應用程序。對PL/SQL過程的調用可能會返回ORA-01403: no data found異常。這種異常是您通常通過向用戶顯示錯誤消息而恢復的異常。例如搜索結果沒有返回任何內容。

如果所有的異常都未被選中,這種類型的檢查異常如何在Spring中處理,即Spring不會強迫你處理它們?

我知道你可以捕獲RuntimeExceptions,但我非常喜歡你被迫處理檢查異常的想法。將某些已檢查的異常轉換爲未經檢查的異常會帶來什麼好處?

回答

2

有些人不喜歡檢查異常,因爲他們強迫你做一些異常管理。我想春天的人都是這種人。

個人而言,我喜歡做的事情,因爲他們的目的是要進行:

try { 
    // execute some SQL 
} catch (SQLException ex) { 
    if (ex is an expected condition) { 
     // deal with it: for example with a "no data found" condition 
     // this might mean returning null, or throwing some kind of business exception, such as 
     // NoEmployeeFoundException, or whatever 
    } else { 
     // this is a programming/environment error 
     // throw as unchecked exception 
     throw new RuntimeException(ex); 
    } 
} 

當然這種方法的缺點是,更多的工作。好處是你已經在代碼中明確表示了「預期」情況,哪些情況不應該發生。

4

是的,應該處理異常,但在Spring設計中,在更高級別上則應該使用每個DAO方法。實際上,在每種方法中都有SQLException處理的設計是不清晰的複製粘貼設計,並且當您更改某些內容時,必須在每個位置應用更改。

有各種各樣的要求,以及處理未經檢查的例外的各種地方。其中之一是方面,您可以在其中例如將Spring的異常轉換爲異常(未捕捉異常不需要在方法簽名中聲明,因此該轉換非常優雅)。在REST方法中,您可以添加通用處理程序,該處理程序將返回調用程序的錯誤響應,並且您只在一個位置編寫異常處理。在基於JSF/JSP的技術中,您可以在出現錯誤時添加自己的錯誤頁面。

+1

你不需要在DAO中處理它,你可以聲明你的DAO接口爲'throws SQLException'(或任何你希望你的DAO引發的異常)。 – gpeche 2012-01-15 20:05:30

+0

是的,但你仍然需要在某個地方處理它。即使你在處理方面,仍然拋出聲明保持,你必須處理你永遠不會得到的異常... – 2012-01-15 20:56:55

+0

那麼你*總是*必須處理異常,除了在開發中。否則你的程序將以不受控制的方式終止。 – gpeche 2012-01-15 21:55:00

2

好處是沒有被迫捕捉或宣佈他們。

我不相信在用戶搜索過程中找不到數據是例外情況,特別是在SQL級別。將其轉換爲檢查的異常等於爲廣義流量控制使用異常。我會認爲應該避免一種反模式;因人而異。

許多與SQL相關的錯誤與代碼有關;海事組織最好在發展過程中快速失敗。