2015-02-23 42 views
6

我覺得自己有點瘋狂,但即使我定義了一個catch,Angular似乎也會拋出對承諾的錯誤。它會向控制檯拋出錯誤,然後允許catch運行。在提交promise之前角控日誌錯誤提示控制檯.catch

這裏是一個super-simple fiddle

測試代碼:

$q.when(1) 
    .then(function() { 
     throw new Error("test"); 
    }).catch(function(error) { 
     console.log('error caught', error); 
    }); 

所得控制檯

enter image description here (髒騙子!)

這裏是a fiddle showing what I expect to happen:所述catch上升,並沒有其他錯誤記錄到控制檯。我沒有配置什麼東西,或者Angular是否實現了破壞的諾言規範?

回答

6

默認角度將所有錯誤記錄到控制檯。

angular還提供了一種重寫此行爲的方法。 $exceptionHandler是一個全球服務,有機會處理任何異常($ http,$摘要期間的錯誤等)。

如果添加這段代碼:

myApp.factory('$exceptionHandler', function() { 
    return function(exception, cause) { 
    exception.message += ' (caused by "' + cause + '")'; 
    //throw exception; 
    }; 
}); 

然後所有的錯誤也只是停止進一步的記錄。儘管會處理catch()處理程序。更新小提琴:http://jsfiddle.net/5jjx5rn3/

UPDATE:

正如在評論中指出的dnc253,有一種更好的方式,如果你打算在實際覆蓋的angularjs服務。即使不是這個問題的焦點,最好知道只要聲明一個具有相同名稱的服務,無論在哪個模塊中,該服務都將被完全替換(最後獲勝)。如果想要在原始服務中添加功能,decorator是正確的選擇。

+0

這是正確的答案,但裝飾者優先於覆蓋整個服務。請參閱http://stackoverflow.com/questions/13595469/how-to-override-exceptionhandler-implementation – dnc253 2015-02-23 21:09:22

+0

但不應該例外甚至沒有達到這一點?它不應該由'catch'處理嗎? – 2015-02-23 21:28:51

+0

@DavidGrinberg'catch'發生在這種方法中的處理之後。這就是爲什麼它首先出現在控制檯中 – Tyrsius 2015-02-23 21:30:34