乐趣区

错误处理

引言

  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,控制返回前端的错误信息}
});
退出移动版