Проблемы производительности обертывания каждого метода с помощью "try catch" в JavaScript


Я хочу знать Ваше мнение о функции, которую я сделал, которая обертывает каждый метод объекта, добавляя обработчики "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-сообщений.

Я хочу обернуть каждый объект создан в моем приложении с этой функцией, но я не уверен, что:

    Разве это плохая практика?
  • есть ли у него проблемы с производительностью?
  • есть ли лучшие способы сделать это?

Заранее спасибо!

3 4

3 ответа:

Я думаю, что лучший способ-это избегать операторов try catch, предотвращая ошибки, добавляя проверки и проверки, но если вам действительно нужно сделать это таким образом, я не думаю, что это будет иметь большую проблему производительности.

Здесь я сделал тест jspref, Чтобы измерить его, и разница показывает только в IE, но это не очень существенно.

Я не знаю, имеет ли метод errorHandler проблемы с производительностью или замедляет ваш код, но если он асинхронный, я думаю, что это не будет проблема.

В отличие от более строгих кодов, таких как Java, Javascript не требует try/catch для большинства экземпляров объектов. Он имеет тенденцию просто не работать, если что-то идет не так, и не взрывается и не заканчивается на вас.

Некоторые части, однако, завершают функцию, поэтому лучшим методом было бы окружить код в целом с помощью try / catch, чтобы он молча отказал, и использовать catch для вызова исходного кода при отправке отчета об ошибке.

Вы все еще можете отправить журнал на сервер, используя глобальную попытку/перехват, потому что объекты исключений содержат информацию.

Однако объект error не является стандартным среди браузеров, я думаю