目前咱們項目的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
function promiseFun() { return new Promise(function (resolve, reject) { redis.get('key', function(){ resolve("Hello"); // reject(); })//歡迎加入全棧開發交流圈一塊兒學習交流:864305860 })//面向1-3年前端人員 }//幫助突破技術瓶頸,提高思惟能力 promiseFun().then().catch();
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
感謝您的觀看,若有不足之處,歡迎批評指正。學習