关于node_redis的错误处理问题,监听error事件不起效。

黄开源中国 发布于 2014/06/18 10:17
阅读 3K+
收藏 0

项目用的express+node_redis。。

var redis_client = redis.createClient(redis_port, redis_ip );
//
//catch error event create by redis connection
redis_client.on("error", function (err) {
        console.log("Error: "+err.stack);
});


这里已经监听了error事件。然后启动项目。redis的连接建立。这时候我把redis_server的进程kill掉。异常依然抛出,然后程序退出。。

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED
    at RedisClient.on_error (/opt/N-chat/node_modules/redis/index.js:185:24)
    at Socket.stream.on.self.should_buffer (/opt/N-chat/node_modules/redis/index.js:95:14)
    at Socket.EventEmitter.emit (events.js:95:17)
    at Socket._destroy.self._writableState.errorEmitted (net.js:440:14)
    at process._tickCallback (node.js:419:13)

Process finished with exit code 8

按照我的设想。。这个监听不是应该类似try catch里面的catch作用??如果我理解有误,请问怎么处理这种异常。。

PS:

网上查过翻过不少github上的项目,但是大部分项目都感觉是自己研究的性质。基本没看到完整的异常处理。如果大家有这种完整已经上线的项目,求链接学习下~

加载中
0
我是潮汐
我是潮汐

你这个问题直接看一下源码就知道了.  你的错误发生在createClient这一行. 而你的错误处理是在后面才注册的. 所以当然不会有任何反应.

黄开源中国
黄开源中国
想跟你确认一下。createClient这一行不是在启动的时候执行吗?~我的意思是应用启用的时候是可以正常启动的。我是等应用启动完以后过一会才kill掉server端的进程。。
0
我是潮汐
我是潮汐

@黄开源中国

你看了源码就会发现, createClient会去创建一个RedisClient  这个RedisClient类会直接去跟redis建立一个连接, 然后等待你的指令, 然而 在这个时候你没有办法监听error事件,因为监听error的这个动作是在Client对象中的, 此时还并没有返回Client对象, 等到后面返回Client对象的时候 错误已经发生了, 代码也没有执行到注册监听那里就直接crash了.   如果你一定要捕捉 可以监听process.on('uncaughtexception', func)

返回顶部
顶部