錯誤處理

引言前端

  1. 須要確認攔截的是什麼類型的錯誤【如攔截的是koa錯誤、或攔截的是http錯誤】??
  2. 這類型錯誤攔截方式有哪些【http的錯誤攔截,在error事件和狀態碼判斷錯誤】??
  3. js主動拋錯與攔截錯的方法有哪些【主動拋錯:throw,reject()、攔截錯:try/catch、Promise.catch】??

js主動拋錯與攔截錯node

主動拋錯:throw,Promise.reject回調
攔截錯:try/catch(只能攔截同步錯誤),Promise.catch回調
一、throw與Promise.reject區別:
    本質不一樣——reject 是回調。而 throw 只是一個同步的語句,若是在另外一個異步的上下文中拋出,在當前上下文中是沒法捕獲到的。
    new Promise(function (resolve,reject) {
      throw new Error('12');
    }).then(function (data) {
      console.log('resolve',data);
    }).catch((err)=>{
      console.log('reject',err);//執行
    });

    new Promise(function (resolve,reject) {
      setTimeout(()=>{
        throw new Error('12');//報錯
      },0)
    }).then(function (data) {
      console.log('resolve',data);
    }).catch((err)=>{
      console.log('reject',err);// 不會執行
    });
二、try/catch不能攔截Promise中的錯誤,但能攔截async/await錯誤:
    try/catch中,當try中的代碼執行完後,仍然沒有錯誤拋出,則不會攔截錯誤。因此try/catch不能攔截Promise中的錯誤,但try/catch能夠攔截async/await中Promise中的錯誤。由於await執行後才能執行await以後的代碼。
    function f2() {
        try {
            Promise.reject('出錯了').catch(err => {
                console.log('2', err)
            });
            console.log('1')
        } catch (e) {
            console.log(e)
        }
    }

http/https錯誤處理app

error事件攔截請求失敗,鏈接上的錯誤
statusCode請求狀態碼,攔截失敗
> 摘自node-fetch
    let http=require('http');
    let req=http.request(options[,callback])
    req.once('socket', function(socket) {
        reqTimeout = setTimeout(function() {
            req.abort();
            reject(new FetchError('network timeout at: ' +          options.url, 'request-timeout'));
        }, options.timeout);
    });
    req.on('error', function(err) {
        clearTimeout(reqTimeout);
        reject(new FetchError('request to ' + options.url + ' failed, reason: ' + err.message, 'system', err));
    });
    req.on('response', function(res) {
        // 此處能夠綁定data&end事件,獲取數據
        if (res.statusCode === 303){
            // 此處能夠拋錯
        }
    });
    req.write(JSON.stringify(params))
    req.end()

koa錯誤處理koa

koa洋蔥模型,對理解使用最外層中間件攔截錯誤有幫助
> 方法一:ctx.throw(404)
> 方法二:app.use(async (ctx,next)=>{
    try{
        await next()
    }catch(e){
        // 中間件由內向外拋錯,這爲最外層的中間件,會攔截全部中間件的錯誤。此處修改ctx.body,控制返回前端的錯誤信息
    }
});
相關文章
相關標籤/搜索