8.1 SQLException
一個(gè)SQLException實(shí)例異常拋出 當(dāng)和數(shù)據(jù)源交互的過程中出現(xiàn)錯(cuò)誤時(shí)咳蔚,該異常包含以下信息:
- 描繪錯(cuò)誤的原文: String 包含了 描繪異常的信息 當(dāng)調(diào)用 SQLException.getMessage 方法時(shí)
- SQL 狀態(tài):Srtring 包含了SQL 狀態(tài),當(dāng)調(diào)用 SQLException.getSQLState 方法時(shí)
- 錯(cuò)誤碼:這是一個(gè)標(biāo)志錯(cuò)誤的 integer 類型的值椰苟,它的值是依賴于特的的實(shí)現(xiàn)的牢贸,也可能是底層數(shù)據(jù)源返回的實(shí)際錯(cuò)誤代碼句惯,錯(cuò)誤代碼可以使用SQLException.getErrorCode方法檢索
- 原因:這是一種人為的拋出導(dǎo)致 SQLException 發(fā)生
- 異常鏈:如果發(fā)生多個(gè)錯(cuò)誤,則可以通過引用異常鏈输拇,所有的異常鏈都可以通過 SQLException.getNextException 去獲得摘符,假如沒有更多的異常鏈了 則 getNextException 方法返回 null
8.2 對于java SE支持鏈?zhǔn)絜xeceptions
SqlException類及其子類已增強(qiáng)為java SE支持鏈?zhǔn)疆惓D芰ΓС执斯δ艿母娜缦拢?/p>
- 添加四個(gè)構(gòu)造函數(shù)以提供原因參數(shù)的支持
- getCause 方法 除了 返回 SQLExceptions 還可能返回 Non-SQLExceptions
有關(guān)附加信息淳附,請參閱JDBC API規(guī)范
8.3 導(dǎo)航 SQLException
在執(zhí)行SQL語句時(shí)可能會出現(xiàn)一個(gè)或多個(gè)異常议慰,每個(gè)異常都有各自潛在的因果關(guān)系。這就意味著當(dāng)一個(gè)JDBC應(yīng)用捕獲一個(gè)SQLException奴曙,有一種可能性别凹,可能會有額外的SQLException拴在原拋出SQLException。訪問附加鏈接的SQLException洽糟,申請將遞歸調(diào)用getnextexception直到返回空值
一個(gè) SQLException 可能會出現(xiàn)因果關(guān)系 炉菲,由一個(gè)或多個(gè) SQLException 拋出造成的。你可以遞歸調(diào)用sqlexception.getcause 方法坤溃,直到返回空值拍霜,
下面的代碼演示了應(yīng)用程序如何瀏覽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) 來導(dǎo)航 SQLException 以及 它們之間的關(guān)系
catch(SQLException ex) {
for(Throwable e : ex ) {
System.out.println("Error encountered: " + e);
}
}
8.5 SQLWarning
SQLWarning 是 SQLException 的子類薪介,下面的接口方法將產(chǎn)生一個(gè)sqlwarning對象如果他們遇到一個(gè)數(shù)據(jù)庫訪問的警告:
- Connection
- DataSet
- Statement
- ResultSet
當(dāng)一個(gè)方法產(chǎn)生一個(gè)sqlwarning對象祠饺,調(diào)用者不了解數(shù)據(jù)訪問的警告。該方法必須調(diào)用適當(dāng)getWarnings對象檢索SQLWarning對象汁政。然而道偷,對sqlwarning的datatruncation子類可以被扔在某些情況下缀旁,見8.3節(jié)“datatruncation”頁上的8-46詳情
如果多個(gè)數(shù)據(jù)訪問的警告時(shí),它們會是在第一個(gè)勺鸦,可以通過遞歸調(diào)用sqlwarning.getnextwarning方法檢索并巍。如果有鏈中沒有更多的警告,getnextwarning返回null
8.6 數(shù)據(jù)截?cái)?/h4>
DataTruncation 是 SQLWarning 的子類换途,提供信息當(dāng)數(shù)據(jù)截?cái)嗟臅r(shí)候懊渡,當(dāng)數(shù)據(jù)源寫入數(shù)據(jù)時(shí)發(fā)生數(shù)據(jù)截?cái)啵粋€(gè) DataTruncation 對象會被拋出军拟,即使已經(jīng)生成警告剃执,已截?cái)嗟臄?shù)據(jù)值也已寫入數(shù)據(jù)源。從數(shù)據(jù)源讀取數(shù)據(jù)時(shí)發(fā)生截?cái)辔悄保瑫?bào)告一個(gè) SQLWarning
一個(gè)datatruncation對象包含以下信息:
- 描繪的字符串 "Data truncation"
- SQLState "01004" 當(dāng) 從數(shù)據(jù)源讀取數(shù)據(jù)時(shí)發(fā)生截?cái)?/li>
- SQLState "22001" 當(dāng)數(shù)據(jù)源寫入數(shù)據(jù)時(shí)發(fā)生數(shù)據(jù)截?cái)?/li>
- 一個(gè) boolean 指示值是否截?cái)酁閰?shù)值或列值忠蝗。
- 給出截?cái)嗟牧谢騾?shù)的索引的int 類型值,如果列的索引值或參數(shù)是未知的漓拾,該方法datatruncation.getindex返回-1,如果索引是未知的戒祠,會返回值datatruncation.getparameter和datatruncation.getread 是未定義 的
- 一個(gè)布爾值骇两,用來指示截?cái)嗍窃谧x還是寫操作上發(fā)生的。如果datatruncation.getread截?cái)喟l(fā)生在讀,則返回 true,如果datatruncation.getread截?cái)喟l(fā)生在寫,則返回 false
- 方法datatruncation.getdatasize返回int姜盈,表示數(shù)據(jù)應(yīng)該已經(jīng)傳送的字節(jié)數(shù)低千。如果數(shù)據(jù)轉(zhuǎn)換正在執(zhí)行,這個(gè)數(shù)字可能是近似的馏颂。如果大小未知示血,則值可能是1
- 方法datatruncation.gettransfersize返回實(shí)際轉(zhuǎn)換的字節(jié) 或 如果字節(jié)數(shù)為-1 則是未知的
8.7 靜止的截?cái)啵⊿ilent Truncation)
statement.setmaxfieldsize方法允許的最大大小(以字節(jié)為單位)是集救拉。此限制僅適用于二進(jìn)制难审、varbinary、LONGVARBINARY亿絮、CHAR告喊、LONGVARCHAR、nchar派昧、nvarchar varchar數(shù)據(jù)類型黔姜,和LONGNVARCHAR
如果使用setmaxfieldsize設(shè)定了最大限制,試圖去讀取超過限制的數(shù)據(jù)時(shí)蒂萎,由于超過規(guī)定的極限秆吵,任何截?cái)嗖粫?bào)道
8.8 BatchUpdateException
一個(gè)batchupdateexception對象提供有關(guān)發(fā)生在批處理語句被執(zhí)行的錯(cuò)誤信息。這個(gè)異常的行為在第14章“批處理更新”中描述
8.9 SQLClientinfoException
SQLClientInfoException 會拋出通過Connection.setClientInfo 方法 發(fā)生在 設(shè)置一個(gè) 或更多個(gè) 指定 的客戶端 properties 失敗時(shí)五慈,sqlclientinfoexception包含信息指示客戶端properties 屬性沒有設(shè)置纳寂。