Nodejs異步回調之異常處理實例

目前咱們項目的Nodejs異常是經過express next 到 errorhandler 中間件去處理的, 本來覺得此方法能夠捕獲到全部的異常,但事實發現並不是如此。 下面以一個異常舉例子:前端

req.get('',function(req, res, next){
 var a = undefined.b; // 產生了一個exception
})
req.use(function(){req, res, next}{
 next(); //最終到 errorhandler中間件中處理
})

上面這個例子中,咱們人爲的製造了一個excepteion,同時咱們指望的結果是異常能進入到咱們寫好的handler中去作處理。 從上面代碼的運行結果來看,也符合咱們的預期。 若是換個地方拋出異常,結果就不是咱們想要的了。node

req.get('',function(req, res, next){
 redis.get('key', function(){
  var a = undefined.b; // 產生了一個exception
 })//歡迎加入全棧開發交流圈一塊兒學習交流:864305860
})
req.use(function(){req, res, next}{
 next(); //最終到 errorhandler中間件中處理
})

上面的代碼拋出的異常並不會被express捕獲,也不會被next到咱們的錯誤處理器中,而是會下面的代碼捕獲redis

process.on('uncaughtException', uncaughtExceptionHandler);

nodejs中,異步回調中的異常是沒法被外圍的try catch捕獲的。express

req.get('',function(req, res, next){
 try{//歡迎加入全棧開發交流圈一塊兒學習交流:864305860
  redis.get('key', function(){
   var a = undefined.b; // 產生了一個exception
  })//歡迎加入全棧開發交流圈一塊兒學習交流:864305860
 }catch(e){
  //並不會進到這裏來
 }
})

解決方案promise

  1. Promise
function promiseFun() {
 return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   resolve("Hello");
   // reject();
  })//歡迎加入全棧開發交流圈一塊兒學習交流:864305860
 })//面向1-3年前端人員
}//幫助突破技術瓶頸,提高思惟能力
promiseFun().then().catch();
  1. Async await
var getAsync1 = await async1();
async function async1() {
return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   resolve("Hello");
   // reject();
  })
 });
}//歡迎加入全棧開發交流圈一塊兒學習交流:864305860
console.log(getAsync1);

But … 若是是下面這樣寫異步

function promiseFun() {
 return new Promise(function (resolve, reject) {
  redis.get('key', function(){
   throw Error(); //依然捕獲不到
  })
 })
}//歡迎加入全棧開發交流圈一塊兒學習交流:864305860
promiseFun().then().catch();

結語async

感謝您的觀看,若有不足之處,歡迎批評指正。學習

相關文章
相關標籤/搜索