我正在尝试为我的核心库中的第三方插件/模块设置自定义错误处理程序,但不知何故,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()
答案 0 :(得分:0)
setErrorHandler
不会设置函数的错误处理程序,因此。 JavaScript不允许您更改Function对象内的被调用代码。
相反,它会调用它所调用的函数的包装版本,并将其返回。
obj.setErrorHandler(myHandler);
无法正常工作,因为返回的包装函数被丢弃,未分配给任何东西。
你可以说:
obj[o]= obj[o].setErrorHandler(myHandler);
虽然我有点担心使用不同的包装版本交换功能的后果。这不一定适用于所有情况,并且肯定会混淆第三方代码。至少,您需要确保不要将函数包装两次,并且还要在包装器中保留调用时this
值:
that.apply(this, a);
(注意:您不需要将arguments
手动转换为数组。将arguments
对象直接传递给apply
是有效的。)