亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解angular中的ErrorHandler

發布時間:2021-10-12 11:06:26 來源:億速云 閱讀:148 作者:iii 欄目:web開發

本篇內容主要講解“如何理解angular中的ErrorHandler”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解angular中的ErrorHandler”吧!

如何理解angular中的ErrorHandler

ErrorHandler

ErrorHandler的默認實現將錯誤消息打印到 console。要攔截錯誤處理,請編寫一個自定義的異常處理器,該異常處理器將把此默認行為改成你應用所需的。

以實際開發中一個例子演示使用方式:
假如前端有提出一個新需求為前端添加全局錯誤處理并上報錯誤日志,處理如下:

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('api/errorLog') === -1) {
		// 上報接口錯誤日志
      this.http.post('/api/errorLog', {
        url: event.url,
        type: 'INTERFACE',
        message: event.message,
        status: event.status,
        statusText: event.statusText,
        param: JSON.stringify(data['body']||undefined),
        body: JSON.stringify((event as any)['body'] || 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”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

莱州市| 南阳市| 灯塔市| 葵青区| 台北县| 绥滨县| 双牌县| 当雄县| 遂宁市| 靖安县| 鹤峰县| 许昌市| 固安县| 慈利县| 剑川县| 竹溪县| 东台市| 韩城市| 开封县| 和顺县| 独山县| 都昌县| 正安县| 辽宁省| 兴山县| 基隆市| 靖宇县| 云和县| 衡阳县| 潮安县| 安多县| 永登县| 东海县| 建德市| 盐山县| 浑源县| 宣武区| 闻喜县| 普兰县| 延川县| 武冈市|