1. 程式人生 > 實用技巧 >校友會小程式開發筆記十二: 小程式異常監控及錯誤處理

校友會小程式開發筆記十二: 小程式異常監控及錯誤處理

在小程式中使用丟擲異常機制能讓程式碼結構更加的簡潔,減少很多的邏輯判斷,並且能夠得到出錯時的詳細錯誤資訊,可說是好處多多,今天

要說的就是在校友錄小程式的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();
        }
    }