AngularJs异常处理程序进入无限循环

时间:2014-10-14 09:58:19

标签: angularjs exception-handling

我正在尝试使用服务器级日志记录创建一个AngularJs应用程序,用于例外。

我的代码:

exceptionHandler.js

app.config(function($provide){

    $provide.decorator("$exceptionHandler", function($injector,$log, ExceptionModel, exceptionService){

       return function(exception, cause){
            //$log.error.apply( $log, arguments );
            var exceptionModel = new ExceptionModel();
            exceptionModel.Exception = "Exception";
            exceptionModel.Cause = "Cause";
            exceptionModel.StackTrace = "StackTrace";

            exceptionService.LogException(exceptionModel).
                             catch(function(){ // do nothing});

        };

    });

});

exceptionService.js

app.service("exceptionService", function ($injector) {

    var _logException = function (exception) {
            var $httpResource = $injector.get("$resource");
            return $httpResource(url, {}).post(exception).$promise;
    }
    this.LogException = _logException
});

只要上面的异常日志记录API不可用(404错误),AngularJs exceptionHandling就会进入无限循环。我有什么遗失的吗?

有没有办法可以抑制AngularJs中的错误,即$ exceptionHandler如果在将错误发送到Server API时出错或者在任何层处理错误时都不会引发异常。

1 个答案:

答案 0 :(得分:0)

首先,您不需要为您的服务注入$ injector,您应该能够简单地注入$ resource。我还建议您使用工厂代替您的例外服务,但您所拥有的工作将会有效。

如果遇到无限循环,返回的方法必须在执行期间抛出一个错误,然后调用异常处理程序,抛出错误,依此类推。

如果在帖子中出现问题,则不会导致抛出错误。问题可能出在ExceptionModel的构造函数中。

我注意到exceptionService中的变量url没有在任何地方定义,这可能会引发错误,除非为清楚起见省略了该部分代码。

此外,$ resource不提供post方法,它来自$ http。在您的示例中,您似乎应该从$ resource切换到$ http,因为您没有将其用作资源:

app.service("exceptionService", function ($http) {
  var _logException = function (exception) {
    return $http.post(url, exception);
  }

  this.LogException = _logException;
});