DWR (Direct Web Remoting) 遠程方法調用異常處理分層策略:全局錯誤處理器、調用級錯誤回調、異常轉換配置,構建健壯的 Ajax 應用體驗。
// 簡單回調 (僅成功處理)
Remote.method(params, function(data) {
alert("返回: " + data);
});
// 多參數時 callback 為最後一個參數
Remote.method(p0, p1, function(data) { ... });
生成的 JS 框架代碼:`Remote.method = function(p0, callback) { dwr.engine._execute(Remote._path, 'Remote', 'method', p0, callback); }`
function globalErrorHandler(errorString, exception) {
logErrorToServer(errorString, exception);
showUserFriendlyMessage("系統暫時不可用,請稍後重試");
}
dwr.engine.setErrorHandler(globalErrorHandler);
Remote.method(params, {
callback: function(data) {
// 成功處理
updateUI(data);
},
errorHandler: function(errorString, exception) {
// 業務特定錯誤處理
if (exception.javaClassName == 'java.sql.SQLException') {
showError("資料庫繁忙,請稍後重試");
} else {
showError("操作失敗: " + errorString);
}
},
// 可選擴展
warningHandler: function(warn) { ... },
textHtmlHandler: function(html) { ... }
});
<convert match="java.lang.Exception" converter="exception"/>
<convert match="com.example.BusinessException" converter="exception" />
| 場景 | 推薦層級 | 處理策略 |
|---|---|---|
| 網路中斷、伺服器 500 | 全局 | 靜默重試、離線隊列、友好提示 |
| 業務驗證失敗 (如庫存不足) | 調用級 | 高亮表單欄位、顯示具體錯誤碼 |
| 權限不足、Session 過期 | 調用級 + 全局 | 調用級導向登入、全局記錄審計日誌 |
| 未預期運行時異常 | 全局 | 記錄完整堆疊、發送告警、顯示通用錯誤頁 |
DWR 錯誤處理完整文檔:https://directwebremoting.org/dwr/other/errors.html
「錯誤是系統的一部分」,分層處理讓異常成為改善體驗的契機而非崩潰導火索。