我想知道你对我所做的一个函数的看法,它包装了一个对象的每个方法,添加"尝试catch"处理程序在服务器端记录JavaScript错误。
由于security restriction,我不想使用window.onerror
,我的脚本将托管在CDN上的其他域中。
/*
* object: Object to be wrapped
* errorHandler: Instance of ErrorHandler Object
*/
function addLog(object, errorHandler) {
var name, method;
for (name in object) {
method = object[name];
if (typeof method === "function") {
object[name] = function(method, name) {
return function() {
try {
return method.apply(this, arguments);
} catch (ex) {
ex.message += "; method: '" + name + "'";
errorHandler.addToStack(ex.message);
throw ex;
}
};
}(method, name);
}
}
return object;
}
errorHandler.addToStack
是自定义对象上的一种方法,它使用Ajax消息异步向服务器发送错误报告。
我想用这个函数包装在我的应用程序上实例化的每个对象,但是我不确定是否:
提前致谢!
答案 0 :(得分:1)
与Java之类的更严格的代码不同,Javascript对于大多数实例化的对象都不需要try / catch。如果出现问题,它往往只是不起作用,并且不会爆炸或结束你。
然而,有些部分会结束这个功能,所以更好的方法是使用try / catch将代码作为一个整体包围,这样它就会无声地失败,并在发送错误时使用catch调用原始代码报告。
答案 1 :(得分:1)
我认为最好的方法是通过防止添加验证和检查发生错误来避免尝试catch语句,但如果你真的需要这样做,我认为它不会有很好的性能问题。 / p>
在这里,我做了一个jspref测试来衡量它,差异仅在IE中显示,但它并不是很重要。
我不知道errorHandler方法是否存在性能问题或者代码速度变慢,但如果它是异步的,我想这不会有问题。
答案 2 :(得分:0)
您仍然可以使用全局try / catch将日志发送到服务器,因为异常对象包含信息。
然而,错误对象在浏览器中不是标准的,我认为