EventEmitter类中对error做的特殊处理
发布于 2 个月前 作者 muyoucun557 428 次浏览 最后一次编辑是 1 个月前 来自 分享

在Node中文文档中看到 "当 EventEmitter 实例遇到错误,通常的处理方法是产生一个 ‘error’ 事件,node 对错误事件做特殊处理。 如果程序没有监听错误事件,程序会按照默认行为在打印出 栈追踪信息 (stack trace) 后退出。"

刚开始的理解是:EventEmitter实例如果在运行中出现错误,Node会检测该实例中是否给’error’事件添加了监听器,如果添加了监听器,会触发监听器;如果没有添加监听器,就会打印出异常,中断线程。于是写了下面代码进行验证。 var e = new EventEmitter(); e.on(‘data’,function(){ console.log(data); //data并未被定义,输出data会报错。 }); e.on(‘error’,function(err){ console.log(“has err”); }); e.emit(‘data’); 经验证,在输出data时产生了error,线程则是直接将error打印出来,并且终止线程,但并未触发e的error事件。 由于英文太菜,不愿查看english DOC,遂在网上查找中文答案,没找到。最后只能查看英文文档。 英文文档中原句:

  • To guard against crashing the Node.js process, a listener can be registered on the process object’s uncaughtException event or the domain module can be used. (Note, however, that the domain module has been deprecated)* 原来检测是process上的error事件的监听器。EventEmitter实例在运行时发生错误,Node就会检查process上的uncaughtException是否添加了监听器,如果添加了监听器,则执行该监听器;如果process的error事件没有添加监听器,Node会打印出异常,并且终止线程。 ps:对于error事件特殊处理还包含domian,由于不懂domian是干什么的,这里就不写了,等学完domian之后,再将补齐。

总结:Node的官方英文文档很重要,要学会阅读英文文档。

3 回复

楼主疑问:①.EventEmitter上出了异常,为何要执行process的error事件的监听器? ②.process的error事件时在什么时候出发的,有什么作用? 麻烦大神看到之后帮我解答一下。

楼主你将事情想复杂了。这其实跟EventEmitter没有任何关系。在 Node.js 中,你只能通过try catch来捕获一个异常,而如果这个异常没有被捕获到,就会触发processuncaughtException事件抛而如果你没有注册该事件的监听器(即该事件没有被处理),则 Node.js 会在控制台打印该异常的堆栈信息,并结束进程。

@leizongmin 哦哦,原来是这样。谢谢

回到顶部