關於Http的錯誤訊息

大家好,不曉得大家有沒有遇過這樣的一個狀況

當我們發送HTTP Request之後,遇到401,console會報錯誤如下:

程式碼如下:

基本上,
subscribe之後的error handler裡面還是有正常運作,
但我想問的是,
會不會在某些舊系統裡,
會因為第一張圖的錯誤,
導致後續angular應該要做的動作失效?

例如發出request之前開loading view,
接到response後,
無論成功失敗都會關掉loading view,
但因第一張圖的錯誤導致無法正常關閉loading view?

所以 subscribe 還有第三個參數是 complete,它總是會被觸發。

大多數情況下錯誤的 http 如果沒有得到很好的處理是會導致視圖出錯的,這裏你可以自己封裝一個 http server 或做一些超時處理。

你好~

我試過囉!,沒有觸發complete

印象中跑到 error , Observable 就會中斷,不會有 complete

要用catch來處理錯誤的情形

Kevin 大~ 我有試過用 try catch 包起來,無效 :persevere:

也有試過像這篇 https://stackoverflow.com/questions/39870972/catch-401-exception-in-angular2
連結所說的,用catch operator去處理,但那個error log還是會出現@@

你如果需要在發生錯誤的時候仍舊觸發 onCompleted,這很簡單:

this.http.get('github.com')
  .catch(err => {
    // 這裏捕獲一個錯誤
    console.log(`Error: ${err}`)
   // 返回一個新流便於觸發原有的 onCompleted
    return Observable.of('new Observable')
  })
  .subscribe(response => {
   // 新流會觸發一次 next
    console.log(`result: ${response}`)
  }, err => {
   // 這裏是不會被觸發的
    console.log(`Error: ${err}`)
  }, _ => {
   // 新流會也會觸發一次 complete
    console.log('completed')
  })  

當然,你完全可以忽略掉錯誤:

  // 這裏的錯誤將會被拋棄,總是能夠觸發 onCompleted
  Observable.onErrorResumeNext(this.http.get('github.com'))
    .subscribe(...)  

換一種方法,你也可以結合 retry 來多觸發幾次 http 請求,直到所有的容錯都沒有解決,再去 onError 裏面手動發射一個公共 complete 流即可。換一種做法你也可以把所有的流都經過一次 catch 包裝,公共處理錯誤。 再換一種做法你可以使用 Observable 下的靜態方法 Observable.catch 來事先準備一個 catch 流解決錯誤。

我不建議在錯誤發生的時候立刻解決它們,你可以做一個有關錯誤的 Service,它接受一個包含錯誤信息的 Observable,在合適的時候統一處理。
FRP 有非常多的方法捕獲錯誤,或是做任何事,你完全可以做更高層的抽象,包裝原有的 http 流做出一套與業務邏輯緊密切合的網路流,它能夠自動處理錯誤,觸發最終的防守動作,以及其他副作用或 http 中的參數補全等等。

最後順便一說,RX 原有一個 onExceptionResumeNext,它能夠返回一個新的 Observable 或重複錯誤流,是否觸發 onError 取決於錯誤類型是 Throwable 還是 Exception (可以看得出它與 onErrorResumeNext 的區別)。但是它好像在 RxJS 中並沒有實現…

3個讚