引言
- 需要确认拦截的是什么类型的错误【如拦截的是koa错误、或拦截的是http错误】??
- 这类型错误拦截方式有哪些【http的错误拦截,在error事件和状态码判断错误】??
- 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,控制返回前端的错误信息
}
});
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。