2013-06-23 125 views
14

在我angularjs應用程序默認的處理程序,我定義了HTTP錯誤的默認處理程序是這樣的:角:未處理的HTTP錯誤

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

其中errorInterceptor是顯示警告場有關該錯誤的一些細節服務在當前頁面的頂部。

現在,當我要處理不同的方式特定錯誤(比如查詢被觸發的模式,我想只有在這種模式將顯示警報,而不是在網頁級別):

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

角度是specificErrorHandling,但仍然觸發我的errorInterceptor,所以我的錯誤報告了兩次。有沒有辦法避免這種情況?

更一般地說,是否有一種角度方式來處理沿着promise鏈的錯誤,這與服務器應用程序的頂層錯誤處理程序不必處理捕獲的異常?

編輯:正如意見中的要求由甜菜,甜菜根,這裏是我的攔截器的代碼:假設你知道哪些錯誤需要被抑制,哪一個需要被傳播

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

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

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

請問您可以發佈(簡體版)errorInterceptor。 –

+0

我認爲顯示攔截器的警報是一個不太好的主意,我認爲有沒有辦法做到這一點(可能是我錯了) –

+0

具體做什麼錯誤不是重要的部分。這實際上是有一個默認的錯誤處理,所以你不必爲100%的異步調用實現一個特定的錯誤處理程序,並且當你實現特定的處理時能夠化解它。很像例外。有沒有比攔截器更好的實現默認錯誤處理程序的方法? –

回答

1

。此外,由於響應攔截器是一個函數,它自身返回承諾

您可以捕獲失敗案例的響應,而不是將其傳播到堆棧上,您可以返回諸如空響應之類的內容。

如果你看一下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. 
     }); 
    } 
}); 
+0

謝謝,但是這個全局錯誤處理程序是在所有其他錯誤處理程序之前執行的,並且知道它會留給其他人。我所追求的是相反的方式:在別人之後執行,只處理他們離開的東西。 –

+1

所以你正在尋找一個通用的錯誤處理程序,它可以處理所有未處理的錯誤,在調用代碼無法處理它的情況下運行? – Chandermani

+0

就是這樣,這是一個默認的錯誤處理程序,當沒有定義特定的錯誤處理程序時(對於非常晚的relpy,我錯過了你的錯誤) –

5

我們有類似的東西。

如果我們處理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:真正的」無添加處理程序很渺茫。有2個錯誤指標的機會也很渺茫,因爲我們已經習慣了它 - 但實際上2個指標總比沒有好..

如果我們有承諾查詢它是否有錯誤處理程序或不在then鏈下,但我們無法在任何地方找到它。