zkrvndm
@zkrvndm
Архитектор решений

Как обернуть содержимое всех объявленных функций в try / catch?

Хочу, чтобы в случае синтаксической ошибки внутри функции возвращалось не исключение, а отклоненный объект $.Deferred с описанием ошибки. Увы, изначально что-то я не додумался оборачивать содержимое своих функций try / catch.

Сейчас я вижу два варианта: переписать все и автозаменой натыкать try / catch... либо замутить что-нибудь с декораторами или прототипами функций. Вариант с декораторами мне не нравится тем, что придется вызовы всех функций обернуть в этот самый декоратор, что будет муторно. С прототипами же другое дело, можно по идее точечно все модифицировать.

Собственно вопрос к знатокам, возможно ли модифицировать прототипы функций таким образом, что вместо ошибок возвращался заданный мной объект с описанием ошибки? И если вдруг да, то как мне это сделать? Пример бы...

Я вот сейчас попытался отредактировать метод call в прототипе, отредактированный метод работает только если вызывать его по имени, а если просто вызовом функции, то уже нет... Что-то я не так делаю.
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
zkrvndm
@zkrvndm Автор вопроса
Архитектор решений
Решение я нашел, но использовать его пожалуй не буду. Если кому интересно:
function test() {
    asdfg();
}

Object.keys(window).filter(function(key) {
    
    return typeof window[key] == 'function' && !window[key].toString().includes('[native code]');
    
}).forEach(function(func) {
    
    eval(window[func].toString());
    
    var current_func = this[func];
    
    window[func] = function() {
        try {
            return current_func.apply(this, arguments);
        } catch(err) {
            return { 'Вот такая ошибка': err.toString() };
        }
    }
    
});

test();

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

62975b9206671812382299.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы