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

Performance concerns about wrapping every method with "try catch" in JavaScript

本文关键字:方法 问题 性能 包装 中用 JavaScript try catch      更新时间:2023-09-26

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

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

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

提前感谢!

我认为

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

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

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

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

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

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

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