您好,登錄后才能下訂單哦!
本文實(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ì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。