Как использовать $http.post при глобальной обработке ошибок?

У меня есть веб-проект MVC 5.0 с компонентами одностраничного приложения AngularJS 1.3. Я хочу отправить обратно в контроллер MVC в случае любых необработанных угловых исключений, поэтому я переопределение фабрики $exceptionHandler следующим образом:

    mod.factory('$exceptionHandler', ['$http', function($http) {
    return function(exception, cause) {
        console.log(exception.message);
        $http.post("Application/CatchAngularError", {
            exception: exception,
            cause: cause
        });
    }
}]);

В Chrome консоль Javascript сообщает «Неперехваченная ошибка: [$injector:cdep] http://errors.angularjs.org/1.3.0/$injector/cdep?p0=%24rootScope%20%3C-%20%24http%20%3C-%20%24exceptionHandler%20%3C-%20%24rootScope", когда я загрузить страницу, включая этот скрипт. Очевидно, $http уже имеет зависимость от $exceptionHandler, поэтому я не могу дать $exceptionHandler зависимость от $http, потому что это создает циклическую зависимость.

Думаю, я могу использовать jQuery.ajax, но я бы предпочел более угловатое решение, если оно существует. У кого-нибудь есть?


person user7710    schedule 11.11.2014    source источник


Ответы (1)


Вы можете использовать службу $injector и найти службу $http:

mod.factory('$exceptionHandler', ['$injector', function($injector) {
    return function(exception, cause) {
        console.log(exception.message);
        var $http = $injector.get('$http');
        $http.post("Application/CatchAngularError", {
            exception: exception,
            cause: cause
        });
    };
person JB Nizet    schedule 11.11.2014
comment
Это сделало это. Спасибо! - person user7710; 11.11.2014
comment
Это сработало, но в моем случае мне пришлось использовать exception.toString(), так как exception не выглядело как простая строка (во всяком случае, в AngularJS 1.5). - person ghiscoding; 01.08.2016