请教,为什么这里throw触发了2个实例的?
发布于 11 年前 作者 rwing 3697 次浏览 最后一次编辑是 8 年前
function class1(name){
 this.name = name;
 var _this = this;
 process.on('uncaughtException', function (e) {
  _this.err(e);
 });
}
class1.prototype.func1 = function(){
 console.log(this.name);
 if(this.name=='aaa')
  throw 'error';
};
class1.prototype.err = function(e){
 console.log(this.name + e);
};
var c1 = new class1('aaa');
var c2 = new class1('bbb');
c1.func1();
c2.func1();

输出结果 aaa aaaerror bbberror

为什么c2实例也触发了?应该怎么写才会是只触发c1的?

3 回复

你在c1.func1()c2.func1()中间,console.log(‘1111’),会发现1111根本没输出。

c2根本没触发,而是你给process的 uncaughtException 注册了2个监听函数,所以c1 throw后,执行了2个函数。两个函数不同,但是内容是一样的。因为闭包的原因,一个_this.name为aaa,一个_this.name为bbb,e为error,所以就有上面的输出了

哦,原来是这样,就是说throw后程序就断了。那如何catch一个不受控的throw,并保持程序不断呢?

你这个根本就不是throw了两次 而是你绑定了两次uncaughtException事件, 所以输出了两次

回到顶部