2014-07-22 45 views
1

某些情況下,某些命令有時會失敗。區分Java中的基本SQLException類型?

假設我有僞碼

try { 
    // insert row 
} catch(SQLException ex) { 
    // create table 
    // insert row 
} 

我想不僅僅是趕上一般SQLException更具體。我想區分。

  • 正常的錯誤,如表不存在或列計數不匹配。

  • 更嚴重的錯誤,如存儲空間超過或Java和MySQL之間的通信錯誤。

我該怎麼做?我查看了各種選項,例如錯誤代碼或子類,但我不確定要採用哪種方式。

我的目標數據庫是MySQL,但我希望這是跨數據庫,如果有一個簡單的方法來做到這一點。 (如剛捕某一類比的SQLException更具體)

+0

錯誤代碼是要走的路 – Sanjeev

+0

可能的重複[哪裏可以找到MySQL的SQLException錯誤代碼列表?](http://stackoverflow.com/questions/7799086/where-can-i-find- sqlexception-error-codes-for-mysql) – alfasin

+0

重複假設提問者已經知道錯誤代碼是要走的路,我沒有(到現在爲止),所以我不確定它是否它符合重複條件。 –

回答

0

Class SQLException

Direct Known Subclasses: 
    BatchUpdateException, RowSetWarning, SerialException, SQLClientInfoException, SQLNonTransientException, SQLRecoverableException, SQLTransientException, SQLWarning, SyncFactoryException, SyncProviderException 

和:

public int getErrorCode() 

Retrieves the vendor-specific exception code for this SQLException object. 

Returns: 
    the vendor's error code 

爲MySQL錯誤代碼可以在Appendix B Errors, Error Codes, and Common Problems

你可以找到應該捕獲最具體的異常(適當的子類),然後在需要更多信息時使用getErrorCode()

+0

這個答案沒有給我指導我是否應該使用錯誤代碼或子類。 –

+0

您可以使用其中之一或兩者:)答案已擴展。 – DavidPostill

0

這是非常基於觀點的,但我認爲SQLException太籠統,不能按原樣使用。

據我所知,大多數訪問數據庫的程序都不會面臨處理不存在表的情況下的處理任務,但有些情況下,比如在檢查表是否存在時寫框架或工具重要。對於這些情況,檢查所需的列是否也存在且具有正確的類型會更有意義。在這些情況下,訪問數據字典是有意義的。當然只有當字典可用時,某些生產產品並非如此。

當數據字典不可用時,唯一的辦法是錯誤消息和錯誤代碼,並且它們都是供應商特定的。這意味着沒有一個解決方案適合所有人。

很久以前,我寫了一個JDBCExceptionHandler,它會收到SQLException,分析它的內容並拋出一個更專用的異常,甚至判斷異常是否可恢復。最終我轉向了Hibernate,它有一套更全面的例外情況,加上隨着供應商改變實施方式,我已經厭倦了維護它。

但是,如果你確實想追求這條線,那麼我的建議是在錯誤消息上使用錯誤代碼和解析器。子類化將起作用,但僅適用於您自己的一組例外。因此,有一個異常處理程序將讀取代碼和消息,然後拋出自己的一組異常,按照您認爲合適的方式對它們進行子類化。

0

在我看來SQL錯誤代碼在這種場景中去,因爲它們可以提供在Oracle文檔中提及的實際執行具體的錯誤代碼的方式:

SQL錯誤代碼。這是一個整數值,標識 導致拋出SQLException實例的錯誤。它的值和含義 是特定於實現的,可能是底層數據源返回的實際錯誤代碼 。通過調用 方法SQLException.getErrorCode來檢索錯誤。

例如,如果調用Java DB的方法CoffeesTable.dropTable爲您的DBMS,COFFEES表不存在,並且要刪除該呼叫JDBCTutorialUtilities.ignoreSQLException,輸出將類似以下內容:

SQLState: 42Y55 
Error Code: 30000 
Message: 'DROP TABLE' cannot be performed on 
'TESTDB.COFFEES' because it does not exist. 

希望這會有所幫助。