[英]javascript setting custom error handler to 3rd party plugins or modules
我正在尝试为核心库中的第三方插件/模块设置自定义错误处理程序,但是不知何故,myHandler不会提醒e.message。
有人可以帮我吗? 谢谢
Function.prototype.setErrorHandler = function(f) {
if (!f) {
throw new Error('No function provided.');
}
var that = this;
var g = function() {
try {
var a = [];
for(var i=0; i<arguments.length; i++) {
a.push(arguments[i]);
}
that.apply(null,a);
}
catch(e) {
return f(e);
}
};
g.old = this;
return g;
};
function myHandler(e) {
alert(e.message)
};
// my Core library object
(function(){
if (typeof window.Core === 'undefined') {
var Core = window.Core = function() {
this.addPlugin = function(namespace, obj){
if (typeof this[namespace] === 'undefined') {
if (typeof obj === 'function') {
obj.setErrorHandler(myHandler);
} else if (!!obj && typeof obj === 'object') {
for (var o in obj) {
if (obj.hasOwnProperty(o) && typeof obj[o] === 'function') {
obj[o].setErrorHandler(myHandler);
}
}
}
this[namespace] = obj;
return true;
} else {
alert("The namespace '" + namespace + "' is already taken...");
//return false;
}
};
};
window.Core = new Core();
}
})();
// test plugin
(function(){
var myPlugin = {
init: function() {},
conf: function() {
return this.foo.x; // error here
}
};
Core.addPlugin("myPlugin", myPlugin);
})();
// test
Core.myPlugin.conf(); // supposed to alert(e.message) from myHandler()
setErrorHandler
,上面代码中的setErrorHandler
不会在Function上设置错误处理程序。 JavaScript无法让您更改Function对象内部的调用代码。
相反,它对调用的函数进行包装,然后返回它。
obj.setErrorHandler(myHandler);
由于返回的包装器函数被丢弃,未分配给任何东西,因此无法工作。
你可以说:
obj[o]= obj[o].setErrorHandler(myHandler);
尽管我有点担心换用不同包装版本的功能的后果。 这不一定适用于所有情况,并且肯定会使第三方代码混乱。 至少,您要确保不要将函数包装两次,并且还要在包装器中保留this
值的调用时:
that.apply(this, a);
(注意:您不需要将arguments
手动转换为数组。直接将arguments
对象传递给apply
是有效的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.