本文實(shí)例講述了Nodejs異步回調(diào)之異常處理。分享給大家供大家參考,具體如下:
目前我們項(xiàng)目的Nodejs異常是通過express next 到 errorhandler 中間件去處理的,
原本以為此方法可以捕獲到所有的異常,但事實(shí)發(fā)現(xiàn)并非如此。
下面以一個(gè)異常舉例子:
req.get('',function(req, res, next){ var a = undefined.b; // 產(chǎn)生了一個(gè)exception})req.use(function(){req, res, next}{ next(); //最終到 errorhandler中間件中處理})上面這個(gè)例子中,我們?nèi)藶榈闹圃炝艘粋€(gè)excepteion,同時(shí)我們期望的結(jié)果是異常能進(jìn)入到我們寫好的handler中去做處理。
從上面代碼的運(yùn)行結(jié)果來看,也符合我們的預(yù)期。
如果換個(gè)地方拋出異常,結(jié)果就不是我們想要的了。
req.get('',function(req, res, next){ redis.get('key', function(){  var a = undefined.b; // 產(chǎn)生了一個(gè)exception })})req.use(function(){req, res, next}{ next(); //最終到 errorhandler中間件中處理})上面的代碼拋出的異常并不會(huì)被express捕獲,也不會(huì)被next到我們的錯(cuò)誤處理器中,而是會(huì)下面的代碼捕獲
process.on('uncaughtException', uncaughtExceptionHandler);所以,nodejs中,異步回調(diào)中的異常是無法被外圍的try catch捕獲的。
req.get('',function(req, res, next){ try{  redis.get('key', function(){   var a = undefined.b; // 產(chǎn)生了一個(gè)exception  }) }catch(e){  //并不會(huì)進(jìn)到這里來 }})解決方案:
1. Promise
function promiseFun() { return new Promise(function (resolve, reject) {  redis.get('key', function(){   resolve("Hello");   // reject();  }) })}promiseFun().then().catch();2. Async await
var getAsync1 = await async1();async function async1() {return new Promise(function (resolve, reject) {  redis.get('key', function(){   resolve("Hello");   // reject();  }) });}console.log(getAsync1);But …
如果是下面這樣寫
function promiseFun() { return new Promise(function (resolve, reject) {  redis.get('key', function(){   throw Error(); //依然捕獲不到  }) })}promiseFun().then().catch();是依然捕獲不到的。
希望本文所述對(duì)大家nodejs程序設(shè)計(jì)有所幫助。
新聞熱點(diǎn)
疑難解答