清理在构造函数中引发错误的对象

Cleanup objects throwing error in constructor

本文关键字:错误 对象 构造函数      更新时间:2023-09-26

简化示例。

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) {
}

一些现实世界的情况以与上面的例子类似的方式发生。尝试构造对象,但构造函数(或可能的父构造函数)引发错误。可能是编程操作抛出,或者一些错误,如引用错误。

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

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

  1. 理想情况下,在您可能需要清理的东西之前做所有可以扔掉的事情,这很好而且很简单。

  2. 如果你不能做到这一点,那么你需要在代码周围有一个try...catch来清理。

#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 变量,因为删除从未添加的变量是无操作的,但这是为了强调在遵循该方法时需要处理的事情。

如您所见,这真的很丑,因此上面的#1。