在小程序中应用抛出异样机制能让代码构造更加的简洁,缩小很多的逻辑判断,并且可能失去出错时的具体错误信息,可说是好处多多,明天
要说的就是在校友录小程序的js中抛出(throw)异样。js中能够抛出任何类型的异样,比方数字、字符串甚至布尔值,例如:
<script> try { throw 'error'; throw 123; throw false; } catch (e) { alert(e); }</script>
当然,像大多数的面向对象语言中有内置的Exception类一样,js中也有内置的异样类: 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;
咱们能够自定义异样类并继承Error基类:
错误代码定义:
/** * 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(); } }