Nodejs非同期コールの異常


現在私達のプロジェクトのNodejs異常はexpress nextを通じてerrorhandlerの中間部品に処理されています.もともとこの方法ですべての異常を捉えることができますが、事実はそうではないことが分かりました.
以下に異常例を示します.
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 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();
まだ捕まらない.