校友會小程式開發筆記十二: 小程式異常監控及錯誤處理
阿新 • • 發佈:2021-01-07
在小程式中使用丟擲異常機制能讓程式碼結構更加的簡潔,減少很多的邏輯判斷,並且能夠得到出錯時的詳細錯誤資訊,可說是好處多多,今天
要說的就是在校友錄小程式的js中丟擲(throw)異常。js中可以丟擲任何型別的異常,比如數字、字串甚至布林值,例如:
<script> try { throw 'error'; throw 123; throw false; } catch (e) { alert(e); } </script>
當然,像大多數的面嚮物件語言中有內建的Exception類一樣,js中也有內建的異常類: Error ,
我們可以自定義異常類並繼承Error基類:
/** * Notes: 應用異常處理類 * Date: 2020-09-05 04:00:00 * Version : CCMiniCloud Framework Ver 2.0.1 const appCode = require('./app_code.js'); class AppError extends Error { constructor(message, code = appCode.LOGIC) { super(message); this.name = 'AppError'; this.code = code; } } module.exports = AppError;
錯誤程式碼定義:
/** * Notes: 錯誤程式碼定義 * Ver : CCMiniCloud Framework 2.0.1 * Date: 2020-09-05 04:00:00 * Version : CCMiniCloud Framework Ver 2.0.1 */ module.exports = { SUCC: 200, SVR: 500, //伺服器錯誤 LOGIC: 1600, //邏輯錯誤 DATA: 1301, // 資料校驗錯誤 HEADER: 1302, // header 校驗錯誤 NOT_USER: 1303, // 使用者不存在 USER_EXCEPTION: 1304, // 使用者異常 MUST_LOGIN: 1305, //需要登入 USER_CHECK: 1306, //使用者稽核中 ADMIN_ERROR: 2001 //管理員錯誤 }
在校友錄小程式中應用:
// 取得openid const cloud = cloudBase.getCloud(); const wxContext = cloud.getWXContext(); let r = ''; try { if (!util.isDefined(event.router)) { console.error('Router Not Defined'); return handlerSvrErr(); } r = event.router.toLowerCase(); // 路由不存在 if (!util.isDefined(router[r])) { console.error('Router [' + r + '] Is Not Exist'); return handlerSvrErr(); } let routerArr = router[r].split('@'); let controllerName = routerArr[0]; let actionName = routerArr[1]; let token = event.token || ''; let params = event.params; console.log(''); console.log(''); let time = timeUtil.time('Y-M-D h:m:s'); console.log('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'); console.log('[' + time + '][Request][Route=' + r + '], Controller=[' + controllerName + '], Action=[' + actionName + '], Token=[' + token + '], ###IN DATA=\r\n', JSON.stringify(params, null, 4)); let openId = wxContext.OPENID; if (!openId) { console.error('OPENID is unfined'); if (config.TEST_MODE) openId = config.TEST_TOKEN_ID; else return handlerSvrErr(); } // 引入邏輯controller controllerName = controllerName.toLowerCase().replace('controller', '').trim(); const ControllerClass = require('controller/' + controllerName + '_controller.js'); const controller = new ControllerClass(openId, params, r, token); // 呼叫方法 let result = await controller[actionName](); // 返回值處理 if (!result) result = handlerSucc(r); // 無資料返回 else result = handlerData(result, r); // 有資料返回 console.log('------'); time = timeUtil.time('Y-M-D h:m:s'); console.log('[' + time + '][Response][Route=' + r + '], ###OUT DATA=', result); console.log('+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'); console.log(''); console.log(''); return result; } catch (ex) { const log = cloud.logger(); if (ex.name == 'AppError') { log.warn({ router: r, errCode: ex.code, errMsg: ex.message }); // 自定義error處理 return handlerAppErr(ex.message, ex.code); } else { console.log(ex); log.error({ router: r, errCode: ex.code, errMsg: ex.message, errStack: ex.stack }); // 系統error return handlerSvrErr(); } }