91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

高尔夫| 手机| 喜德县| 绥棱县| 从江县| 靖安县| 新宾| 安福县| 鹤岗市| 尖扎县| 古丈县| 蓬安县| 阳信县| 林州市| 贵溪市| 富平县| 河池市| 南平市| 恩施市| 沙坪坝区| 黔江区| 富平县| 石楼县| 望江县| 江城| 独山县| 绥化市| 新化县| 丰城市| 清丰县| 天全县| 聂拉木县| 贞丰县| 象山县| 方山县| 山丹县| 云阳县| 调兵山市| 博野县| 星子县| 宣城市|