关于在JavaScript中使用“try catch”包装每个方法的性能问题

时间:2012-05-28 16:40:47

标签: javascript performance error-handling try-catch wrapper

我想知道你对我所做的一个函数的看法,它包装了一个对象的每个方法,添加"尝试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消息异步向服务器发送错误报告。

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

  • 这是一种不好的做法吗?
  • 是否存在性能问题?
  • 有没有更好的方法呢?

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

然而,有些部分会结束这个功能,所以更好的方法是使用try / catch将代码作为一个整体包围,这样它就会无声地失败,并在发送错误时使用catch调用原始代码报告。

答案 1 :(得分:1)

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

在这里,我做了一个jspref测试来衡量它,差异仅在IE中显示,但它并不是很重要。

我不知道errorHandler方法是否存在性能问题或者代码速度变慢,但如果它是异步的,我想这不会有问题。

答案 2 :(得分:0)

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

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