Ошибка журналов Angular для консоли перед повышением promise.catch

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

Вот суперпростая скрипка

Код теста:

$q.when(1)
    .then(function() {
        throw new Error("test");
    }).catch(function(error) {
        console.log('error caught', error);
    });

Полученная консоль

введите здесь описание изображения(грязный лжец!)

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


person Kyeotic    schedule 23.02.2015    source источник


Ответы (1)


angular по умолчанию записывает все ошибки в консоль.

angular также предоставляет способ переопределить это поведение. $exceptionHandler — это глобальный сервис, которому дается возможность обрабатывать любые исключения ($http, ошибки во время $digest и т. д.).

Если вы добавите этот фрагмент кода:

myApp.factory('$exceptionHandler', function() {
  return function(exception, cause) {
    exception.message += ' (caused by "' + cause + '")';
    //throw exception;
  };
});

Тогда все ошибки просто прекратят дальнейшее ведение журнала. Однако будет обрабатывать обработчики catch(). Обновленная скрипта: http://jsfiddle.net/5jjx5rn3/

ОБНОВИТЬ:

Как указано dnc253 в комментариях, есть лучший способ, если вы намереваетесь фактически переопределить службу angularjs. Даже не будучи в центре внимания этого вопроса, лучше знать, что простое объявление службы с тем же именем в любом модуле полностью заменяет службу (побеждает последняя). Если кто-то хочет добавить функциональность исходной службе, декоратор правильный выбор.

person André Werlang    schedule 23.02.2015
comment
Это правильный ответ, но декоратор предпочтительнее, чем перезапись всей службы. См. раздел stackoverflow.com/questions/13595469/. - person dnc253; 24.02.2015
comment
Но разве исключение не должно даже дойти до этого момента? Разве это не должно было быть обработано catch? - person David says Reinstate Monica; 24.02.2015
comment
@DavidGrinberg catch происходит после обработки, которая происходит в этом методе. Вот почему он отображается в консоли первым - person Kyeotic; 24.02.2015