Nodejs非同期コールの異常
4957 ワード
現在私達のプロジェクトのNodejs異常はexpress nextを通じてerrorhandlerの中間部品に処理されています.もともとこの方法ですべての異常を捉えることができますが、事実はそうではないことが分かりました.
以下に異常例を示します.
上のコードの運行結果から見ても、私達の予想に合致します.
もし場所を変えて異常を投げたら、結果は私達が欲しいものではないです.
1.Promise
次のように書くなら
以下に異常例を示します.
req.get('',function(req, res, next){
var a = undefined.b; // exception
})
req.use(function(){req, res, next}{
next(); // errorhandler
})
上記の例では、私たちが考えているexcepteinonを作成しました.同時に私たちが期待している結果は、私たちが書いたhandlerの中に異常に入って処理します.上のコードの運行結果から見ても、私達の予想に合致します.
もし場所を変えて異常を投げたら、結果は私達が欲しいものではないです.
req.get('',function(req, res, next){
redis.get('key', function(){
var a = undefined.b; // exception
})
})
req.use(function(){req, res, next}{
next(); // errorhandler
})
上のコードから投げられた異常はexpressに捕獲されません.またnextは私達のエラープロセッサに送られません.下のコードで捕獲されます.process.on('uncaughtException', uncaughtExceptionHandler);
したがって、nodejsでは、非同期の異常は、周辺のtry catchに捕獲されない.req.get('',function(req, res, next){
try{
redis.get('key', function(){
var a = undefined.b; // exception
})
}catch(e){
//
}
})
ソリューション:1.Promise
function promiseFun() {
return new Promise(function (resolve, reject) {
redis.get('key', function(){
resolve("Hello");
// reject();
})
})
}
promiseFun().then().catch();
2.Async awaitvar 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();
まだ捕まらない.