【问题标题】:Angular: Default handler for unhandled http errorsAngular:未处理的 http 错误的默认处理程序
【发布时间】:2013-06-19 22:12:12
【问题描述】:

在我的 angularjs 应用程序中,我以这种方式为 http 错误定义了一个默认处理程序:

myapp.config([ '$httpProvider', function($httpProvider) {
    $httpProvider.responseInterceptors.push('errorInterceptor')
}])

其中errorInterceptor 是一项服务,可在当前页面顶部的警报字段中显示有关错误的一些详细信息。

现在,当我想以不同的方式处理特定错误时(比如查询是在模态中触发的,并且我想仅在此模态中显示警报,而不是在页面级别):

$http.get('/my/request').then(success, specificErrorHandling)

Angular 执行了specificErrorHandling,但仍然触发了我的errorInterceptor,因此我的错误被报告了两次。有没有办法避免这种情况?

更一般地说,是否有一种 Angular 方法来仅处理 promise 链中尚未处理的错误,就像服务器应用程序的顶级错误处理程序不必处理捕获的一样例外?

编辑:根据 Beetroot-Beetroot 在 cmets 中的要求,这是我的拦截器的代码:

@app.factory 'errorInterceptor', [ '$q', 'alertsHandler',
  ($q, alertsHandler) ->
    success = (response) ->
      response

    failure = (response) ->
        alertsHandler.raise(response)

    (promise) ->
      promise.then success, failure
]

【问题讨论】:

  • 你能发布一个(简化版的)errorInterceptor吗?
  • 我认为显示来自拦截器的警报不是一个好主意,我认为没有办法实现这一点(可能是我错了)
  • 具体如何处理错误并不是重要的部分。它实际上是关于有一个默认的错误处理,所以你不必为 100% 的异步调用实现一个特定的错误处理程序,并且当你实现一个特定的处理时能够化解它。很像例外。有没有比拦截器更好的方法来实现默认错误处理程序?

标签: javascript angularjs error-handling promise


【解决方案1】:

我们有类似的东西。

如果我们处理 http 错误,我们会在请求中传递一个名为 errorHandled:true 的属性

$http({
    method: 'GET',
    url: '/my/url',
    errorHandled:true
}).then(function(){ ... }, function(){ ... });

然后在responseError: function(rejection){ ... } 的拦截中,我们可以通过查看rejection.config.errorHandled 来查看是否设置了此标志,如果没有 - 然后我们会弹出一个带有错误的 toastr 对话框。代码看起来像这样

function ( rejection ) { 
    if ( !rejection.config.errorHandled && rejection.data.message ){
        toastr.error(rejection.data.message, 'Error');
    }
    return $q.reject(rejection); 
} 

有人在不添加处理程序的情况下编写“errorHandled:true”的可能性很小。有 2 个错误指示器的机会也很小,因为我们已经习惯了 - 但实际上 2 个指示器总比没有要好..

如果我们承诺在then 链中查询它是否有错误处理程序,那就太好了,但我们在任何地方都找不到。

【讨论】:

    【解决方案2】:

    假设您知道需要抑制哪些错误以及需要传播哪些错误。此外,由于响应拦截器是一个返回承诺本身的函数

    您可以捕获失败情况的响应,而不是将其传播到堆栈中,您可以返回诸如空响应之类的内容。

    如果您查看拦截器角度文档中的 sample 示例

    $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
        return function(promise) {
            return promise.then(function(response) {
                // do something on success
            }, function(response) {
                // do something on error
                if (canRecover(response)) {
                    return responseOrNewPromise; // This can suppress the error.
                }
                return $q.reject(response); // This propogates it.
            });
        }
    });
    

    【讨论】:

    • 谢谢,但是这个全局错误处理程序在所有其他人之前执行并且知道它留给其他人什么。我追求的是相反的方式:在其他人之后执行并且只处理他们留下的东西。
    • 所以你正在寻找一个通用的错误处理程序,它可以处理所有未处理的错误,在调用代码不处理它的情况下运行?
    • 就是这样,当没有定义特定的错误处理程序时的默认错误处理程序(对不起,很晚的 relpy,我错过了你的)
    猜你喜欢
    • 2016-07-12
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2015-07-13
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多