Вызов catch () для angularjs $ http.get () не подавляет ошибку - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующий код (упрощенно и работает в codepen для примера):

var app = angular.module("httptest", []);

app.controller("getjson", ["$scope", "$http", function($scope, $http) {
  $http.get("https://codepen.io/anon/pen/LVEwdw.js").
  then((response) => {
    console.log(response.data)
    console.log('in then')
    throw 'the error'
  }).catch((e) => {
    console.log('in the catch')
    console.log(e);
  });
}]);

Я ожидаю, что, если введен блок catch()ошибка не будет отображаться в консоли, за исключением случаев, когда она регистрируется явно (т. е. она не отображается красным цветом).Однако это не так, на консоль выводится красное сообщение об ошибке, после чего вводится блок catch().Я попытался настроить эквивалентный пример здесь , который не использует AngularJS $http, и он ведет себя так, как я ожидаю:

var promise1 = new Promise(function(resolve, reject) {
  resolve();
});

promise1.then((result) => {
  console.log('about to throw error')
  throw 'hey'
 }).catch(function(error) {
  console.log(error);
});

В этом примере, красная ошибка не делает егочерез.

Что здесь происходит, и можно ли подавить обработанную ошибку в случае $http?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Это поведение было исправлено в выпуске AngularJS 1.6:

Из коммитов GitHub:

fix ($ q): обрабатывать сгенерированные ошибки как регулярные отклонения

Ранее ошибки, выдаваемые обработчиками обещания onFulfilled или onRejected, обрабатывались несколько иначе, чем обычные отклонения: они передавались в $exceptionHandler() (в дополнение к преобразованию в отклонения).

- AngularJS GitHub Commit e12eea

См. Также Руководство разработчика AngularJS - Переход на V1.6 - $ q

0 голосов
/ 26 февраля 2019

Вы можете найти объяснение в строке 8416 в вашем связанном модуле angularjs.Они просто console.error в операторе catch.Вы можете переопределить это поведение, например, пустым обработчиком:

angular.module('exceptionOverride', []).factory('$exceptionHandler', () => (exception, cause) });

var app = angular.module("httptest", ['exceptionOverride']);

....
...