引言前端
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,控制返回前端的錯誤信息 } });