清理在构造函数中引发错误的对象
Cleanup objects throwing error in 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) {
}
一些现实世界的情况以与上面的例子类似的方式发生。尝试构造对象,但构造函数(或可能的父构造函数)引发错误。可能是编程操作抛出,或者一些错误,如引用错误。
在引发异常之前,侦听器或其他数据由构造函数设置。如何处理此问题以避免内存泄漏和在失败对象上发出事件?清理垃圾,删除添加的侦听器等。
你需要在构造函数中处理它,或者
-
理想情况下,在您可能需要清理的东西之前做所有可以扔掉的事情,这很好而且很简单。
-
如果你不能做到这一点,那么你需要在代码周围有一个
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。
相关文章:
- 错误:对象没有't支持'自动完成'
- 错误对象,本地和自定义,如何区分
- jQuery Deferred and promise-错误:对象没有't支持属性或方法'然后'
- 如何访问npm模块抛出的自定义错误对象[error:[object object]]
- 如何从 MVC4 链接调用 Javascript 方法(错误 JavaScript 运行时错误:对象不支持此操作)
- 节点发布错误对象的第一个“属性”
- 错误 [对象 BlobConstructor]' 不是 safari 中的构造函数
- JSHint 错误“对象不支持此属性或方法”用于 javascript 闭包
- 下拉 Javascript 错误:对象不支持属性或方法“匹配”
- 运行时错误:对象不支持属性或方法
- JavaScript 错误(Microsoft JScript 运行时错误:对象预期)
- 类型错误:对象 #<对象> 没有方法“身份验证”
- Javascript 错误:对象在 IE 浏览器中不支持此属性或方法
- 如果statusCode不是200,那么从http调用返回什么类型的错误对象
- 未捕获的类型错误:对象#<节点列表>没有方法'addEventListener'
- 未捕获的类型错误:对象没有方法'sortContents'
- MVC4和日期选择器:“;0x800a01b6-JavaScript运行时错误:对象没有't支持属性或方法
- Microsoft JScript运行时错误:对象没有't支持属性或方法'html'
- 未捕获的类型错误:对象#<对象>没有方法'绑定'-脊梁骨
- IE8 Javascript错误:对象没有'不支持此属性或方法