Предотвращение бесконечных циклов ошибок с правильной обработкой исключений
Я использую 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 говорит об этом?