做項目過程中發現使用DWR方式調用遠程方法,有時會莫名的彈出alert框,內容為“error”。是有可能返回空值或者直接錯誤,必須做出相應的異常處理:
Remote.method(params,function(data){
//服務端執行後用戶端的邏輯,如
alert("服務端執行後返回的資料:"+data);
});
Remote->處理類,method->類中方法,params->method方法中參數,function->回調方法,data->回調方法返回的資料。
第一個參數為用戶端傳向服務端的資料,最後一個參數直接就是一個回呼函數。因為服務端根據 Java 對象產生的 js 代碼就是:
Remote.method = function(p0, callback) {
dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback);
}
如果遠程方法在處理請求時拋出了異常,DWR 只會給出alert("Error") 簡單顯示錯,所以需要去琢磨如何主動捕獲這種錯誤,更友好的展示給使用者。所以若碰到遠程調用的異常
那個alert("Error") 其實是 DWR 的全域錯誤處理,可通過 dwr.engine.setErrorHandler(errorHandler) 來改變它的預設行為的,如
function errh(errorString, exception) {
alert("提示你自訂的全域出錯資訊。");
}
dwr.engine.setErrorHandler(errh);
也許我們很少這麼做,因為全域性的錯誤處理滿足不了個人化的遠程調用。我們可以把錯誤處理 errorHandler 寫在遠程調用的函數參數中。回頭看前面那個 callback,當它是一個函數時,就是個成功調用後的處理函數,它也可以是個包含幾個函數的對象,此時遠程調用就要這麼寫:
Remote.method(params,{
callback:function(data){ //調用成功時的處理函數
//服務端執行後用戶端的邏輯,如
alert("服務端執行後返回的資料:"+data);
},
errorHandler:function(errorString, exception) {//執行異常時
alert('修改 XXX 時出錯,請檢查 XXX 云云:'+ errorString)
}
}
);
更深入的,callback 中不可以包括另外兩個函數屬性:exceptionHandler、warningHandler 和 textHtmlHandler。沒有 exceptionHandler 處理函數就會去應用 errorHandler 函數,並且如果在 callback 函數中的 js 出錯也會跑到 errorHandler 去執行的。
再,還能在 dwr.xml 中配置有關異常的 convert,如:<convert match="java.lang.Exception" converter="exception"/>,通過 errorHandler 的 errorString、exception 擷取更詳細的資訊。