WEB開發系統異常設計思路整理

來源:互聯網
上載者:User

原文網址:http://www.uml.org.cn/j2ee/201109143.asp

在Web程式開發設計當中,總離不開系統異常報錯、錯誤提示、規則驗證等情況,不同的人,解決的辦法也多種多樣,這裡我列舉一下常見做法:

1 無任何提示

2 在jsp頁面裡直接:alert(‘操作失敗');

3 在伺服器控制台裡system.out.println('插入資料失敗!');

4 後台throw new RunTimeException("儲存失敗");

5 跳轉到500.jsp 顯示操作錯誤

上面5種做法,我覺得都有比較欠缺的地方,下面我做一下具體解釋:

1 任何一個成功的項目,這樣的使用者體驗直接讓人嘔吐,用產品這個詞去稱呼這個系統簡直是對產品這兩個字的侮辱,點了沒反應人家還以為你在畫原型呢!

2 在jsp頁面裡alert,這個稍微進步一點,但還是不能正確引導客戶,到底是報價時間未到,還是價格報的太高? 沒有具體的業務說明,不解的客戶立馬拿起電話往你們客服那打, 讓客服伺候客戶吧。然後呢,這個問題一般也不會當做bug去修改。。。

3 這種是典型的“程式員”風格報錯方法。寫這個代碼的人還停留在“學院派”,也就是剛畢業時的那種編碼調試習慣,完全不用debug調試,完全printf起家,,, 你在這邊跟他說:“我流程走不下去啦”, 這是他會不忙不忙解釋:“你等等,我去看看控制台。噢,明白啦,你還沒操作XXX呢”,無語了,這系統是做給客戶用呢還是,,,

4 能寫if(true) throw new 異常類 代碼的程式員,恭喜您,已經成功脫離菜鳥層級了,對代碼、設計、產品體驗有一定的認識,但是由於種種原因,無法完美地把這個業務提示友好地傳遞到前台顯示,後面我將對這個問題進行重點的闡述。

5 最標準的做法,這種做法一般能解決大部分問題,但是面對當前ajax大行其道的今天,到是靠跳轉頁面去提示錯誤,也不是一個完整的解決方案。

下面我給出自己設計異常的一些經驗,在這裡,我不想光談空洞的理論,所有會牽扯到一些技術、架構,前台架構技術可以觸類旁通。

解決異常我們一般分幾步走:

1 設計異常

2 在合適的地方拋出異常

3 在合適的地方顯示異常提示

4 如何“自動”提示異常錯誤而不需要在jsp裏手工編寫顯示異常代碼(這裡需要整合前後台架構並修改源碼)

第1個問題解決方案 異常的設計:

由於文章主題是J2EE異常設計,這裡我不會深入討論 已檢查異常、未檢查異常這些老生常談的話題。

我的做法是,設計好異常類。先設計一個異常超類

public class WsdException extends RuntimeException {

/** serialVersionUID */
private static final long serialVersionUID = 1L;

/** DEFAULT_LAYOUT 預設的異常tiles模板*/
public static final String DEFAULT_LAYOUT="baseSideLayout";

private String layout=DEFAULT_LAYOUT;

public WsdException(String msg) {
super(msg);
}

public WsdException(String msg, String layout) {
super(msg);
this.layout=layout;
}

layout這個屬性的用途後面再做解釋,先記住有這麼個東西。

然後各個業務模板繼承這個WsdException 類, 在拋出業務代碼異常的時候可以寫 throw new BargainException("您的報價過高!"), 有些人煩惱異常類應該放到那個包路徑下面

是放 com.aa.bb.exception還是放com.aa.bb.action下面還是com.aa.bb.domain下面呢? 我個人偏好於放在跟拋出這個異常所在的service同級, 比如BargainException可以放到 com.aa.bb.service目錄下面,

例如spring源碼裡的就是這樣的規則放置異常類的,不必單獨起一個目錄去放異常類,除非是你的核心包的常見異常基類。

第2個問題 異常設計:如何在合適的地方拋出異常?

在這裡,正常的操作成功內容提示我就不講了,也沒必要講,這裡考慮的是錯誤失敗的時候如何處理, 拋出異常顯然在後台java代碼,條件不成立的時候顯示地拋出運行時異常。例如

if((select count(id) from user)==0

throw new UserException("使用者不存在!");

這樣子拋出的異常是一種比較優雅的方式, 如何檢測null 指標異常,插入欄位過大等異常處理,第3,4步我在細講。'

第3個問題 在合適的地方顯示異常提示?

在ajax大行其道的今天,通過跳轉到500頁面顯示錯誤提示,顯示不大顯示。 你也許會說:“很簡單啊,我不會在ajax的回調方法裡 alert(json) 嗎?”, 這個不是個問題。 您說的沒錯, 別急,先聽我慢慢分析:

假設您這個ajax是想查詢使用者列表資料, 假設這個功能正常調用, 回呼函數 function(json) json裡的值就是一個使用者數組, 但假設這個ajax請求調用失敗了, 會發生什嗎? 也許是資料庫連接失敗, 也許是許可權不足,

您那個"alert(json)" 還抵用嗎? 這個json參數,到底是一個數組還是一個錯誤提示串還是未知, 也許你跟我說我可以寫 typeof(json) if...else alert('json"); 這樣做並沒有錯。 您能想到這麼多,很難得,說明

您已經是個web開發老手了, 根本不用擔心別人說你寫的功能bug有多少, 系統頁面多了,功能多了,您能保證大部分coder都是剛畢業的人寫的嗎? 現在中國浮躁的IT大環境是:會寫代碼的人少些或不寫,不會寫代碼的

拚命瞎寫, 我不敢保證每位仁兄都會有語句 if(判斷json類型) 如何如何, 這個很容易遺漏, 而且也不會寫, 鬼知道您是同步還是非同步呼叫?

如果是引用相同的頁面, 有的是 $().load() 有的是 include jsp 有的是iframe, 有的是快顯視窗, 也有可能是同步、非同步請求都會用, 這時你如何智能地判斷並提示? 當然能做到:同步請求跳到錯誤500.jsp,

非同步請求能自動提示alert(“後台拋出的異常錯誤提示”),那該多好啊, 記住, 我說的是自動提示, 不是你在前台還去寫這個提示代碼, 很多時候,很多新手都會忘記這個alert, 通常項目一急, 就會忘記這個事情。

第4個問題 如何“自動”提示異常錯誤而不需要在jsp裏手工編寫顯示異常代碼

問題4就是解決問題3的辦法, 首先既要解決異常資訊在前台非同步呼叫的時候通過架構代碼自動去提示, 又要能智能判斷到底瀏覽器是同步還是非同步請求呢?

同步請求是 把錯誤放到bean裡面, 非同步請求是輸出 json格式的資料,例如 {success:false,.faile:'true','result':'資料庫連接失敗'}.

下面是我的解決辦法:

4.1 使用spring的SimpleMappingExceptionResolver類統一解決異常,看看DispacherServlet裡就知道啦, spring mvc在請求過程中會有一個統一的異常解析器, 我們可以寫一個自己的異常解析器,判斷一下,

如果是同步請求,就返回一個error.jsp的ModelAndView, 如果是一個非同步請求, 我們則打出json格式的字串, 而非返回一個錯誤頁面, 如何判斷同步非同步,看看request裡的head資訊就知道啦。

也許有人會問:我用jquery的 $(div).load('url.do") 這個返回的是一個頁面, 嚴格來講, 你不能把他當做非同步, 因為它是load一個頁面來填充一個div, 這個時候你可以通過$(div).load('url.do?isAjax=true")的方式

來解決, 當然 $.getJSON $.ajax 這種典型的非同步就不在話下拉。

問題又來了, 我異常是拋出了呀, 非同步呼叫,也用自己的異常解析器打出了json串, 那前台不alert, 他哪會自動提示? 呵呵, 問題的關鍵在於: 你寫非同步呼叫,總會用到ajax架構吧?這年頭別跟我說還寫原生的

xmlhttprequet, 不管你用的是ptototype ext jquery motools , 您都可以在 ajax架構的源碼裡做一點小動作: ajax請求源碼裡有一個回呼函數, 你後台返回了一個{success:false,'result':'資料庫連接失敗'}., 我們可以在

架構的源碼裡 if(json.faile=='true') , 然後就alert(json.result) 就行啦, 自己的jsp裡不需要手寫錯誤提示, 這樣子多好, (推薦jquery.message), 這樣提示比alert友好一些.

不用自己在前天寫alert提示多好啊, 不管後台是報資料庫欄位找不到還是儲存檔案失敗, 都可以“自動地提示啦!

最後本文為對layout做解釋, 有興趣的朋友加以討論, 則個是在做tiles模板的時候用的,彈出頁面儲存總改換個模板名吧? 呵呵

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.