4

我想知道你对我制作的一个函数的看法,它包装了一个对象的每个方法,添加了“try catch”处理程序来记录服务器端的 JavaScript 错误。

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 消息将错误报告异步发送到服务器。

我想用这个函数包装在我的应用程序上实例化的每个对象,但我不确定是否:

  • 这是一个不好的做法吗?
  • 它有性能问题吗?
  • 有没有更好的方法来做到这一点?

提前致谢!

4

3 回答 3

1

与 Java 等更严格的代码不同,Javascript 不需要对大多数实例化的对象进行 try/catch。如果出现问题,它往往根本不起作用,并且不会爆炸或结束于你。

然而,有些部分确实结束了函数,因此更好的方法是用 try/catch 将代码作为一个整体包围,这样它就会静默失败,并在发送错误报告时使用 catch 调用原始代码。

于 2012-05-28T16:47:46.420 回答
1

我认为最好的方法是通过防止错误发生添加验证和检查来避免 try catch 语句,但如果你真的需要这样做,我认为它不会有很大的性能问题。

这里我做了一个jspref测试来测量它,差异只在IE中表现出来,但不是很显着。

我不知道errorHandler方法是否有性能问题或者拖慢你的代码,但是如果是异步的,我想应该不会有问题。

于 2012-05-28T20:45:49.470 回答
0

您仍然可以使用全局 try/catch 将日志发送到服务器,因为异常对象包含信息。

但是错误对象在浏览器中不是标准的,我认为

于 2012-05-28T17:21:58.490 回答