第八章 異常(Exceptions)

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è)置纳寂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主穗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子烈疚,更是在濱河造成了極大的恐慌黔牵,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爷肝,死亡現(xiàn)場離奇詭異猾浦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)灯抛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門金赦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人对嚼,你說我怎么就攤上這事夹抗。” “怎么了纵竖?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵漠烧,是天一觀的道長。 經(jīng)常有香客問我靡砌,道長已脓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任通殃,我火速辦了婚禮度液,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘画舌。我一直安慰自己堕担,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布曲聂。 她就那樣靜靜地躺著霹购,像睡著了一般。 火紅的嫁衣襯著肌膚如雪句葵。 梳的紋絲不亂的頭發(fā)上厕鹃,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音乍丈,去河邊找鬼剂碴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛轻专,可吹牛的內(nèi)容都是我干的忆矛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼催训!你這毒婦竟也來了洽议?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漫拭,失蹤者是張志新(化名)和其女友劉穎亚兄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體采驻,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡审胚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了礼旅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膳叨。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痘系,靈堂內(nèi)的尸體忽然破棺而出菲嘴,到底是詐尸還是另有隱情,我是刑警寧澤汰翠,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布龄坪,位于F島的核電站,受9級特大地震影響复唤,放射性物質(zhì)發(fā)生泄漏悉默。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一苟穆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唱星,春花似錦雳旅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哎榴,卻和暖如春型豁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背尚蝌。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工迎变, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飘言。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓衣形,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姿鸿。 傳聞我的和親對象是個(gè)殘疾皇子谆吴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法倒源,類相關(guān)的語法,內(nèi)部類的語法句狼,繼承相關(guān)的語法笋熬,異常的語法,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 六種異常處理的陋習(xí) 你覺得自己是一個(gè)Java專家嗎腻菇?是否肯定自己已經(jīng)全面掌握了Java的異常處理機(jī)制胳螟?在下面這段代...
    Executing閱讀 1,329評論 0 6
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,671評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)芜繁,斷路器旺隙,智...
    卡卡羅2017閱讀 134,660評論 18 139
  • 如果當(dāng)時(shí)我勇敢一點(diǎn)就好了,可能現(xiàn)在有些事情就變得不一樣骏令。 不知道你們有沒有過這樣的想法蔬捷,我有過,不止一次榔袋。 念頭最...
    802號病房_官方閱讀 1,947評論 0 0