第八章 異常(Exceptions)

8.1 SQLException

一個SQLException實例異常拋出 當和數(shù)據(jù)源交互的過程中出現(xiàn)錯誤時,該異常包含以下信息:

  • 描繪錯誤的原文: String 包含了 描繪異常的信息 當調(diào)用 SQLException.getMessage 方法時
  • SQL 狀態(tài):Srtring 包含了SQL 狀態(tài),當調(diào)用 SQLException.getSQLState 方法時
  • 錯誤碼:這是一個標志錯誤的 integer 類型的值,它的值是依賴于特的的實現(xiàn)的,也可能是底層數(shù)據(jù)源返回的實際錯誤代碼,錯誤代碼可以使用SQLException.getErrorCode方法檢索
  • 原因:這是一種人為的拋出導致 SQLException 發(fā)生
  • 異常鏈:如果發(fā)生多個錯誤,則可以通過引用異常鏈,所有的異常鏈都可以通過 SQLException.getNextException 去獲得,假如沒有更多的異常鏈了 則 getNextException 方法返回 null

8.2 對于java SE支持鏈式execeptions

SqlException類及其子類已增強為java SE支持鏈式異常能力,支持此功能的更改如下:

  • 添加四個構造函數(shù)以提供原因參數(shù)的支持
  • getCause 方法 除了 返回 SQLExceptions 還可能返回 Non-SQLExceptions

有關附加信息,請參閱JDBC API規(guī)范

8.3 導航 SQLException

在執(zhí)行SQL語句時可能會出現(xiàn)一個或多個異常,每個異常都有各自潛在的因果關系。這就意味著當一個JDBC應用捕獲一個SQLException,有一種可能性,可能會有額外的SQLException拴在原拋出SQLException。訪問附加鏈接的SQLException,申請將遞歸調(diào)用getnextexception直到返回空值

一個 SQLException 可能會出現(xiàn)因果關系 ,由一個或多個 SQLException 拋出造成的。你可以遞歸調(diào)用sqlexception.getcause 方法,直到返回空值,

下面的代碼演示了應用程序如何瀏覽sqlexception及其原因:

catch(SQLException ex) {
while(ex != null) {
System.out.println("SQLState:" + ex.getSQLState());
System.out.println("Error Code:" + ex.getErrorCode());
System.out.println("Message:" + ex.getMessage());
Throwable t = ex.getCause();
while(t != null) {
System.out.println("Cause:" + t);
t = t.getCause();
}
ex = ex.getNextException();
}
}

8.4 使用 For-Each 循環(huán) 對于 SQLException

JDBC 異??赡軙褂?JavaSE For-Each 循環(huán) 來導航 SQLException 以及 它們之間的關系

catch(SQLException ex) {
for(Throwable e : ex ) {
System.out.println("Error encountered: " + e);
}
}

8.5 SQLWarning

SQLWarning 是 SQLException 的子類,下面的接口方法將產(chǎn)生一個sqlwarning對象如果他們遇到一個數(shù)據(jù)庫訪問的警告:

  • Connection
  • DataSet
  • Statement
  • ResultSet

當一個方法產(chǎn)生一個sqlwarning對象,調(diào)用者不了解數(shù)據(jù)訪問的警告。該方法必須調(diào)用適當getWarnings對象檢索SQLWarning對象。然而,對sqlwarning的datatruncation子類可以被扔在某些情況下,見8.3節(jié)“datatruncation”頁上的8-46詳情

如果多個數(shù)據(jù)訪問的警告時,它們會是在第一個,可以通過遞歸調(diào)用sqlwarning.getnextwarning方法檢索。如果有鏈中沒有更多的警告,getnextwarning返回null

8.6 數(shù)據(jù)截斷

DataTruncation 是 SQLWarning 的子類,提供信息當數(shù)據(jù)截斷的時候,當數(shù)據(jù)源寫入數(shù)據(jù)時發(fā)生數(shù)據(jù)截斷,一個 DataTruncation 對象會被拋出,即使已經(jīng)生成警告,已截斷的數(shù)據(jù)值也已寫入數(shù)據(jù)源。從數(shù)據(jù)源讀取數(shù)據(jù)時發(fā)生截斷,會報告一個 SQLWarning
一個datatruncation對象包含以下信息:

  • 描繪的字符串 "Data truncation"
  • SQLState "01004" 當 從數(shù)據(jù)源讀取數(shù)據(jù)時發(fā)生截斷
  • SQLState "22001" 當數(shù)據(jù)源寫入數(shù)據(jù)時發(fā)生數(shù)據(jù)截斷
  • 一個 boolean 指示值是否截斷為參數(shù)值或列值。
  • 給出截斷的列或參數(shù)的索引的int 類型值,如果列的索引值或參數(shù)是未知的,該方法datatruncation.getindex返回-1,如果索引是未知的,會返回值datatruncation.getparameter和datatruncation.getread 是未定義 的
  • 一個布爾值,用來指示截斷是在讀還是寫操作上發(fā)生的。如果datatruncation.getread截斷發(fā)生在讀,則返回 true,如果datatruncation.getread截斷發(fā)生在寫,則返回 false
  • 方法datatruncation.getdatasize返回int,表示數(shù)據(jù)應該已經(jīng)傳送的字節(jié)數(shù)。如果數(shù)據(jù)轉換正在執(zhí)行,這個數(shù)字可能是近似的。如果大小未知,則值可能是1
  • 方法datatruncation.gettransfersize返回實際轉換的字節(jié) 或 如果字節(jié)數(shù)為-1 則是未知的

8.7 靜止的截斷(Silent Truncation)

statement.setmaxfieldsize方法允許的最大大?。ㄒ宰止?jié)為單位)是集。此限制僅適用于二進制、varbinary、LONGVARBINARY、CHAR、LONGVARCHAR、nchar、nvarchar varchar數(shù)據(jù)類型,和LONGNVARCHAR

如果使用setmaxfieldsize設定了最大限制,試圖去讀取超過限制的數(shù)據(jù)時,由于超過規(guī)定的極限,任何截斷不會報道

8.8 BatchUpdateException

一個batchupdateexception對象提供有關發(fā)生在批處理語句被執(zhí)行的錯誤信息。這個異常的行為在第14章“批處理更新”中描述

8.9 SQLClientinfoException

SQLClientInfoException 會拋出通過Connection.setClientInfo 方法 發(fā)生在 設置一個 或更多個 指定 的客戶端 properties 失敗時,sqlclientinfoexception包含信息指示客戶端properties 屬性沒有設置。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內(nèi)部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,623評論 18 399
  • 六種異常處理的陋習 你覺得自己是一個Java專家嗎?是否肯定自己已經(jīng)全面掌握了Java的異常處理機制?在下面這段代...
    Executing閱讀 1,410評論 0 6
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,021評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • 如果當時我勇敢一點就好了,可能現(xiàn)在有些事情就變得不一樣。 不知道你們有沒有過這樣的想法,我有過,不止一次。 念頭最...
    802號病房_官方閱讀 2,031評論 0 0

友情鏈接更多精彩內(nèi)容