首頁 > web前端 > js教程 > 主體

一起聊聊angular中的ErrorHandler

青灯夜游
發布: 2022-01-28 18:05:10
轉載
2661 人瀏覽過

本篇文章帶大家了解一下angular中的異常處理ErrorHandler,透過例子介紹一下ErrorHandler的使用方法,希望對大家有所幫助!

一起聊聊angular中的ErrorHandler

ErrorHandler

#ErrorHandler的預設實作會將錯誤訊息印到 console。要攔截錯誤處理,請編寫一個自訂的異常處理器,該異常處理器將把此預設行為改成你應用所需的。 【相關教學推薦:《angular教學》】

以實際開發中一個範例示範使用方式:
假如前端有提出一個新需求為前端新增全域錯誤處理並回報錯誤日誌,處理如下:

1、建立錯誤處理的error-handler.service.ts

import { HttpClient } from '@angular/common/http';
import { ErrorHandler, Injectable } from '@angular/core';

@Injectable()
export class AppGlobalErrorhandler implements ErrorHandler {
    constructor(private http:HttpClient){ }
  // 当程序中出现异常时,会自动调用 handleError 钩子,可判断是客户端还是来自服务端的异常。
  handleError(error) {
  	// 打印错处信息
    console.warn("customize catch execption:" , error.stack);
    // ...
	// 异常处理逻辑
	// ...
    if(['ExpressionChangedAfterItHasBeenCheckedError'].every(item => !error.stack.includes(item))){
    	// 上报错误日志
        this.http.post('/api/errorLog', {
            url: location.href,
            type: 'WEB',
            error: error.stack,
            message: error.toString()
        }).subscribe()
    }
  }
}
登入後複製

2、在app.module .ts中新增

import { AppGlobalErrorhandler } from './service/error-handler.service';
...
providers:  [
...
 { provide: ErrorHandler, useClass: GlobalErrorHandler},
...
]
登入後複製

當程式中出現異常時,會自動呼叫handleError鉤子,可判斷是客戶端還是來自服務端的例外。

3、在上面處理的是頁面發生的異常,實際開發中同時也需要上報介面等的異常,目前使用的是ng-alain框架,所以在default.interceptor.ts攔截器中加入程式碼,具體參考:ng-alain—攔截網路請求

  private handleData(
    event: HttpResponse<any> | HttpErrorResponse,
    data?:any
  ): Observable<any> {
	// 判断是否为错误实例
    if (event instanceof HttpErrorResponse && event.url.indexOf(&#39;api/errorLog&#39;) === -1) {
		// 上报接口错误日志
      this.http.post(&#39;/api/errorLog&#39;, {
        url: event.url,
        type: &#39;INTERFACE&#39;,
        message: event.message,
        status: event.status,
        statusText: event.statusText,
        param: JSON.stringify(data[&#39;body&#39;]||undefined),
        body: JSON.stringify((event as any)[&#39;body&#39;] || undefined),
        error:JSON.stringify( event.error),
      }).subscribe()
    }

    return of(event);
  }

// 拦截器
  intercept(
    req: HttpRequest<any>,
    next: HttpHandler,
  ){
    return next.handle(newReq).pipe(
     // 当请求发生错误时,使用一个管道把错误发送给错误处理器
      catchError((err: HttpErrorResponse) => this.handleData(err,newReq)),
      mergeMap((event: any) => {
        // 允许统一对请求错误处理,这是因为一个请求若是业务上错误的情况下其HTTP请求的状态是200的情况下需要
        if (event instanceof HttpResponse && event.status === 200)
          return this.handleData(event);
        // 若一切都正常,则后续操作
        return of(event);
      }),
    );
  }
登入後複製

上面第3點的寫法中的不是透過自動呼叫handleError 鉤子來處理錯誤的,在Interceptor攔截器中只能處理HttpErrorResponse類型的錯誤,如果這裡處理了,那麼ErrorHandler將捕獲不到。所以在Interceptor中,如果一定要透過handleError鉤子函數來處理錯誤,那麼就需要將HttpErrorResponse類型的錯誤拋出。如下:

catchError((error: HttpErrorResponse) => {
        if (error.status === 401) {
          // 跳到登录页或者刷新token
        } else {
          return throwError(error);
        }
 })
登入後複製

更多程式相關知識,請造訪:程式設計影片! !

以上是一起聊聊angular中的ErrorHandler的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:csdn.net
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!