nodejs process uncaughtException

用过Node一段时间之后,发现那些在事件主循环里碰到的异常会导致Node进程退出。在许多应用场景下,特别是对那些希望永不当机的服务器程序来说,这都是不接受的。uncaughtException事件会提供一个极其暴力的方法来捕获这些异常。它确实是最后一道防线了,但对解决此问题上非常有效果。

示例1

Js代码

var http = require('http');

var server = http.createServer(function(req,res){
    res.writeHead(200,{});
    res.end('response');
    setTimeout(function(){
        console.log('This will still run.');
    },2000);
    method(); //由于method()未定义,会将程序进程退出。
    console.log('response end');
});

server.listen(10086);

process.on('uncaughtException', function (err) {
    console.log('Caught Exception:' + err);//直接捕获method()未定义函数,Node进程未被退出。
});

示例2

Js代码

var http = require('http');

var server = http.createServer(function(req,res){
    res.writeHead(200,{});
    res.end('response');
    setTimeout(function(){
        method(); //由于method()未定义,会将程序进程退出。
        console.log('This will still run.');
    },2000);
//    method();
});

server.listen(10086);

process.on('uncaughtException', function (err) {
    console.log('Caught Exception:' + err); //直接捕获method()未定义函数,Node进程未被退出。
});

上述的例子,我们为uncaughtException创建了一个事件监听器。然后将异常描述做一个简单的标准输出,由于method()函数未定义,所以它捕获了一个不存在的函数触发的事件,所以Node程序程序不会退出,但是标准的执行流程会被打断。console.log('response end')这段代码将不会被执行,而setTimeout()函数里的程序将在2秒后执行,因为它在异常捕获时,已经加入事件队列中。

posted @ 2018-10-25 10:37  诗和远方-ysk  阅读(1442)  评论(0编辑  收藏  举报