引言

  1. 需要确认拦截的是什么类型的错误【如拦截的是koa错误、或拦截的是http错误】??
  2. 这类型错误拦截方式有哪些【http的错误拦截,在error事件和状态码判断错误】??
  3. js主动抛错与拦截错的方法有哪些【主动抛错:throw,reject()、拦截错:try/catch、Promise.catch】??

js主动抛错与拦截错

主动抛错:throw,Promise.reject回调
拦截错:try/catch(只能拦截同步错误),Promise.catch回调
1、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);// 不会执行
    });
2、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错误处理

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洋葱模型,对理解使用最外层中间件拦截错误有帮助
> 方法一:ctx.throw(404)
> 方法二:app.use(async (ctx,next)=>{
    try{
        await next()
    }catch(e){
        // 中间件由内向外抛错,这为最外层的中间件,会拦截所有中间件的错误。此处修改ctx.body,控制返回前端的错误信息
    }
});

qzuser
31 声望4 粉丝