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