摘要:出現(xiàn)這種情況的可能性太多太多,例如服務(wù)器連接不上參數(shù)不正確等。調(diào)用代碼需要進一步處理和恢復(fù)。當(dāng)然清理資源后,可以繼續(xù)拋出非檢測異常,阻止程序的執(zhí)行。根據(jù)觀察和理解,檢測異常大多可以應(yīng)用于工具類中。
異常的選擇“唵”,表示佛部心,謂念此字時,自己的身體要應(yīng)于佛身,口要應(yīng)于佛口,意要應(yīng)于佛意,所謂身、口、意與佛成一體,才能獲得成就;
異常的分類,你應(yīng)該知道:
受審查異常
非受審查異常
發(fā)現(xiàn)學(xué)生在使用過程當(dāng)中,沒有區(qū)分,也不知道應(yīng)該什么時候使用?跟不清楚怎么樣合理的使用異常!
我再后面接手的課程體系當(dāng)中,學(xué)生如果在使用異常的情況下,最愛的是Exception,怎么解釋呢,簡單好用?只能心里默默的呵呵!而作為一名開發(fā)人員使用比較多的是非受審查異常[繼承RuntimeException]!往往這個時候,學(xué)生就懵圈了,為什么呢?因為看不到錯誤了,不知道哪里錯了!
心在滴血,因為給自己增加了難度,何必難為自己嫩?
那么,如何使用異常呢?簡單說一下個人的理解:
調(diào)用或者執(zhí)行的代碼不能繼續(xù)執(zhí)行,需要立即終止。出現(xiàn)這種情況的可能性太多太多,例如服務(wù)器連接不上、參數(shù)不正確等。這些時候都適用非檢測異常,不需要調(diào)用代碼的顯式捕捉和處理,而且代碼簡潔明了。
調(diào)用代碼需要進一步處理和恢復(fù)。假如將 SQLException 定義為非檢測異常,這樣操作數(shù)據(jù)時開發(fā)人員理所當(dāng)然的認(rèn)為 SQLException 不需要調(diào)用代碼的顯式捕捉和處理,進而會導(dǎo)致嚴(yán)重的 Connection 不關(guān)閉、Transaction 不回滾、DB 中出現(xiàn)臟數(shù)據(jù)等情況,正因為 SQLException 定義為檢測異常,才會驅(qū)使開發(fā)人員去顯式捕捉,并且在代碼產(chǎn)生異常后清理資源。當(dāng)然清理資源后,可以繼續(xù)拋出非檢測異常,阻止程序的執(zhí)行。根據(jù)觀察和理解,檢測異常大多可以應(yīng)用于工具類中。
胖先生說一下:
讓機器自己去處理,我們不管!
就是我們需要捕獲并且自己處理
別把客戶想的太聰明在實際開發(fā)當(dāng)中,胖顯示都會把受審查變成非受審查的,但是同時我根據(jù)自己的業(yè)務(wù)需要進行處理!
將異常直接打印在客戶端的例子屢見不鮮,以 JSP 為例,一旦代碼運行出現(xiàn)異常,默認(rèn)情況下容器將異常堆棧信息直接打印在頁面上。其實從客戶角度來說,任何異常都沒有實際意義,絕大多數(shù)的客戶也根本看不懂異常信息,軟件開發(fā)也要盡量避免將異常直接呈現(xiàn)給用戶。
客戶都是比較懶的人,如果出現(xiàn)那種文字,站在你的角度,我想會感覺到厭惡,考察我英語四級能力呢?
package com.pangsir.test.sample.exception; /** * 自定義 RuntimeException * 添加錯誤代碼屬性,一種簡單的封裝 */ public class RuntimeException extends java.lang.RuntimeException { //默認(rèn)錯誤代碼 public static final Integer GENERIC = 1000000; //錯誤代碼 private Integer errorCode; public RuntimeException(Integer errorCode, Throwable cause) { this(errorCode, null, cause); } public RuntimeException(String message, Throwable cause) { //利用通用錯誤代碼 this(GENERIC, message, cause); } public RuntimeException(Integer errorCode, String message, Throwable cause) { super(message, cause); this.errorCode = errorCode; } public Integer getErrorCode() { return errorCode; } }
正如示例代碼所示,在異常中引入錯誤代碼,一旦出現(xiàn)異常,我們只要將異常的錯誤代碼呈現(xiàn)給用戶,或者將錯誤代碼轉(zhuǎn)換成更通俗易懂的提示。其實這里的錯誤代碼還包含另外一個功能,開發(fā)人員亦可以根據(jù)錯誤代碼準(zhǔn)確的知道了發(fā)生了什么類型異常.
別玷污我我們授課當(dāng)中經(jīng)常說基于MVC思想的開發(fā)架構(gòu),因此我們將代碼分為controller,Service,Dao等不同的層次,Dao層中經(jīng)常會拋出異常的方法[因為不熟練,因為SQL語句經(jīng)常寫錯誤],都是過來人:
Dao層代碼:
public User load(Integer user_id) throw SQLException { //根據(jù) ID 查詢數(shù)據(jù)庫,獲取用戶對象信息 }
如果代碼是這樣寫的,沒有什么問題,可以說正確,但是不符合規(guī)范!
從設(shè)計耦合角度仔細(xì)考慮一下,這里的 SQLException 污染到了上層調(diào)用代碼,調(diào)用層需要顯式的必須利用 try-catch 捕捉 或者 向更上層次繼續(xù)拋出。根據(jù)隔離原則,我們可以適當(dāng)修改成:
public User load(Integer user_id) { try{ //根據(jù) ID 查詢數(shù)據(jù)庫 }catch(SQLException e){ //利用非檢測異常封裝檢測異常,降低層次耦合 throw new RuntimeException(SQLErrorCode, e); }finally{ //關(guān)閉連接,清理資源 } }別不在乎我的感受
在學(xué)生開發(fā)當(dāng)中,也可以說我為了圖省事的過程當(dāng)中,經(jīng)常說的一句話就是你把異常輸出[打印]控制臺中,其實這樣沒有任何意思!
重要|重要|重要:
這樣的處理沒有意思,因為你沒有中斷程序的執(zhí)行,進而調(diào)用代碼會繼續(xù)自行,導(dǎo)致更多的異常
想想你是否寫過這樣的代碼:
public void update(User user){ try{ //..some code that throws SQLException }catch(SQLException ex){ /** *了解的人都知道,這里的異常打印毫無意義,僅僅是將錯誤堆棧輸出到控制臺。 * 而在 Production[生產(chǎn)] 環(huán)境中,需要將錯誤堆棧輸出到日志。 * 而且這里 catch 處理之后程序繼續(xù)執(zhí)行,會導(dǎo)致進一步的問題 * */ ex.printStacktrace(); } }
代碼重構(gòu)
public void update(User user){ try{ //..some code that throws SQLException } catch(SQLException ex){ //轉(zhuǎn)換成非受審查異常 throw new RuntimeException(“自己描述性語言,例如com.pangsir.user.dao.UserDao.update 執(zhí)行過程出錯”, ex); } finally{ //關(guān)閉資源 } }
地主家也沒有余糧這個誤區(qū)比較基本,一般情況下都不會犯此 > 低級錯誤 < 。
看一下,下面的代碼是否有問題?
//假設(shè)獲取用戶的所有信息 ListuserList = this.userDao.listAll();// for(int i=0; i 在講課的時候我們已經(jīng)知道異常處理占用系統(tǒng)資源.別把這個多帶帶看成一個演示示例,想想我們的設(shè)計當(dāng)中從控制層->Service->Dao層
換個角度說,類 A 中執(zhí)行了一段循環(huán),循環(huán)中調(diào)用了 B 類的方法,B 類中被調(diào)用的方法卻又包含 try-catch 這樣的語句塊。褪去類的層次結(jié)構(gòu),代碼和上面如出一轍。
還有一次隱藏的錯誤,這里我就不說了!有過有知道請留言給我,不是錯誤,就是不符合地主家沒有余糧的概念!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/65089.html
原文地址: http://www.jtahstu.com/blog/s... Python爬蟲框架Scrapy實戰(zhàn) - 抓取BOSS直聘招聘信息 零、開發(fā)環(huán)境 MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports) CPU : 2 GHz Intel Core i5 RAM : 8 GB 1867 MHz LPDDR3 Python 版本: v3...
原文地址: http://www.jtahstu.com/blog/s... Python爬蟲框架Scrapy實戰(zhàn) - 抓取BOSS直聘招聘信息 零、開發(fā)環(huán)境 MacBook Pro (13-inch, 2016, Two Thunderbolt 3 ports) CPU : 2 GHz Intel Core i5 RAM : 8 GB 1867 MHz LPDDR3 Python 版本: v3...
摘要:前段時間,有個人吐槽自己的同事是上古程序猿,一直堅持反對使用。上古程序猿堅決反對用,我該怎么說服他分布式鎖如果你是一位后端工程師,面試時八成會被問到,特別是大廠,不僅要求能簡單使用,還要深入理解底層原理,具備解決常見問題的能力。 前段時間,有個人吐槽自己的同事是上古程序猿,一直堅持反對使用Redis。那位上古程序猿設(shè)計公司...
摘要:前段時間,有個人吐槽自己的同事是上古程序猿,一直堅持反對使用。那位上古程序猿設(shè)計公司的業(yè)務(wù)系統(tǒng)時候,始終堅持永遠(yuǎn)不要用緩存其他人想用,例如做個接口防重復(fù),一定要用數(shù)據(jù)庫來實現(xiàn),包括定期失效之類的功能。項目中使用,主要考慮性能和并發(fā)。 前段時間,有個人吐槽自己的同事是上古程序猿,一直堅持反對使...
摘要:前段時間,有個人吐槽自己的同事是上古程序猿,一直堅持反對使用。那位上古程序猿設(shè)計公司的業(yè)務(wù)系統(tǒng)時候,始終堅持永遠(yuǎn)不要用緩存其他人想用,例如做個接口防重復(fù),一定要用數(shù)據(jù)庫來實現(xiàn),包括定期失效之類的功能。項目中使用,主要考慮性能和并發(fā)。 前段時間,有個人吐槽自己的同事是上古程序猿,一直堅持反對使...
閱讀 642·2021-11-25 09:43
閱讀 1655·2021-11-18 10:02
閱讀 1033·2021-10-15 09:39
閱讀 1877·2021-10-12 10:18
閱讀 2115·2021-09-22 15:43
閱讀 756·2021-09-22 15:10
閱讀 2084·2019-08-30 15:53
閱讀 978·2019-08-30 13:00