Предотвращение бесконечных циклов ошибок с правильной обработкой исключений

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

Я использую Sentry для сообщения об исключениях, но я не общаюсь с Sentry из клиентского кода. Вместо этого я сообщаю об исключениях из клиентского кода в веб-API (используя XHR), который затем сообщает об этом в Sentry.

Несколько дней назад произошло то, что кто-то посетил наш сайт в FireFox 10, поэтому клиентский код попал в бесконечный цикл ошибок из-за плохо поддерживаемого JavaScript, поэтому он буквально рассылал спам /DoS'd наш API с исключениями. Наш API находится за NetScaler, поэтому мы решили настроить ограничитель скорости, и если запросы достигают ограничителя скорости, мы теперь возвращаем код состояния HTTP 503 (служба недоступна).

Ошибка выглядела примерно так:

([объект Object], [объект Object], (void 0)) @ / Static / Scripts / app / vendor / angular-translate / angular-translate.min.js: 6 applyDirectivesToNode ([массив объектов], [объект HTMLAnchorElement], [объект Object], (void 0), (void 0), null, [объект Array], [объект Array], [объект Object]) @ / Static / Scripts / app / vendor / angular / angular.js: 7498 compileNodes ([объект Proxy], (void 0)) @ / Static / Scripts / app / vendor / angular / angular.js: 7040 compileNodes ([объект Proxy], (void 0)) @ / Static / Scripts / app / vendor /angular/angular.js:7054 compileNodes ([прокси объекта], (void 0)) @ / Static / Scripts / app / vendor / angular / angular.js: 7054 compileNodes ([прокси объекта], (void 0)) @ /Static/Scripts/app/vendor/angular/angular.js:7054 compileNodes ([прокси объекта], (void 0)) @ / Static / Scripts / app / vendor / angular / angular.js: 7054 compileNodes ([объект объекта ], (void 0), [object Object], (void 0), (void 0), null) @ / Static / Scripts / app / vendor / angular / angular.js: 7054...

Теперь к проблеме. Я хочу реализовать правильную обработку исключений в клиентском коде, поэтому он продолжает сообщать об ошибках в API / Sentry, но если он получает ответ с кодом состояния HTTP 503, он должен немедленно остановить выполнение сценария и остановить его.

Поэтому я попытался реализовать $exceptionHandler декоратор в моем конфиге модуля Angular:

// Flag indicating that the JavaScript execution should be stopped and Sentry should NOT be notified
var stopExecution = false;

$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
    return function(exception, cause) {
        $delegate(exception, cause);

        if(stopExecution) return;

        // Call Sentry and report the exception
        SentryServiceProvider.$get().captureException(exception)
            .error(function (data, status, headers, config) {
                if(status === 503) {
                    if(stopExecution) return;
                    stopExecution = true;
                    throw new Error('GOT AN 503 ERROR FROM API, STOPPING EXECUTION');
                }
            });
    };
}]);

мой captureException() Функция в SentryServiceProvider просто вызывает API с запросом POST и отправляет сообщение об исключении и трассировку стека в объекте JSON в качестве полезной нагрузки и возвращает обещание $ http.

sentryService.captureException = function (ex) {
    return $http.post(API_URL + '/sentry', { Message: ex.message, StackTrace: ex.stack });
};

Теперь проблема в том, что он находится в бесконечном цикле, он никогда не идет к error() обратный вызов и продолжает спамить API навсегда. Как я могу сделать это, чтобы предотвратить бесконечные циклы ошибок в моем клиентском коде, поэтому он останавливается, когда API говорит об этом?

0 ответов

Другие вопросы по тегам