清理对象在构造函数中抛出错误

时间:2016-03-16 12:11:46

标签: javascript exception memory-leaks error-handling constructor

简化示例..

Javascript对象构造函数

var Foo = function() {
    someEventEmitter.on("event", this.someHandler);
    throw new Error("Unexpected error happening in a constructor");
}
// ...

var myObject;
try {
    myObject = new Foo();
} catch(e) {

}

某些现实案例的情况与上述示例类似。尝试构造对象,但构造函数(或可能是父构造函数)会抛出错误。可以编程操作抛出,或者像参考错误一样的bug。

在抛出异常之前,构造函数会在/上设置侦听器或其他数据。如何处理以避免内存泄漏和故障对象上发出的事件?清理垃圾,删除添加的侦听器等。

1 个答案:

答案 0 :(得分:1)

你需要在构造函数中处理它,

  1. 理想情况下,做一切可以在之前抛出你可能需要清理的东西,这很简单。

  2. 如果您不能这样做,那么您需要在代码周围加try...catch来清理。

  3. #2的例子:

    var Foo = function() {
        var emitterHooked = false;
        try {
            someEventEmitter.on("event", this.someHandler);
            emitterHooked = true;
            throw new Error("Unexpected error happening in a constructor");
        } catch (e) {
            if (emitterHooked) {
                try { 
                    someEventEmitter.off("event", this.someHandler);
                } catch (e2) { }
            }
            throw e;
        }
    };
    

    当然,对于许多事件机制,你并不真正需要emitterHooked变量,因为删除一个从未添加的变量是一个无操作,但这是为了强调你的事情类型在遵循这种方法时需要处理。

    正如你所看到的那样,这真的很丑陋,因此排名第一。 : - )