中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

如何理解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

崇礼县| 会昌县| 福海县| 青川县| 福安市| 宿州市| 长汀县| 太仆寺旗| 万荣县| 平安县| 广宗县| 景洪市| 双牌县| 高碑店市| 花莲县| 宜州市| 新绛县| 桑日县| 砀山县| 屯昌县| 乡宁县| 弋阳县| 贡觉县| 曲阳县| 塔河县| 益阳市| 武陟县| 蓬溪县| 湄潭县| 灵丘县| 兴和县| 隆化县| 微博| 咸阳市| 吉隆县| 老河口市| 高州市| 北票市| 西乌珠穆沁旗| 庆元县| 青铜峡市|