Проблемы производительности обертывания каждого метода с помощью "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 ответа:
Я думаю, что лучший способ-это избегать операторов try catch, предотвращая ошибки, добавляя проверки и проверки, но если вам действительно нужно сделать это таким образом, я не думаю, что это будет иметь большую проблему производительности.
Здесь я сделал тест jspref, Чтобы измерить его, и разница показывает только в IE, но это не очень существенно.
Я не знаю, имеет ли метод errorHandler проблемы с производительностью или замедляет ваш код, но если он асинхронный, я думаю, что это не будет проблема.
В отличие от более строгих кодов, таких как Java, Javascript не требует try/catch для большинства экземпляров объектов. Он имеет тенденцию просто не работать, если что-то идет не так, и не взрывается и не заканчивается на вас.
Некоторые части, однако, завершают функцию, поэтому лучшим методом было бы окружить код в целом с помощью try / catch, чтобы он молча отказал, и использовать catch для вызова исходного кода при отправке отчета об ошибке.