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

溫馨提示×

溫馨提示×

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

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

Angular中常用的錯誤處理方式有哪些

發布時間:2021-09-13 07:34:41 來源:億速云 閱讀:138 作者:chen 欄目:web開發

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

什么是Angular

Angualr 是一款來自谷歌的開源的 web 前端框架,誕生于 2009 年,由 Misko Hevery 等人創建,后為 Google 所收購。是一款優秀的前端 JS 框架,已經被用于 Google 的多款產品當中。

AngularJS 是基于聲明式編程模式 是用戶可以基于業務邏輯進行開發. 該框架基于HTML的內容填充并做了雙向數據綁定從而完成了自動數據同步機制. 最后, AngularJS 強化的DOM操作增強了可測試性.

try/catch

最熟悉的的方式,就是在代碼中添加try/catch塊,在try中發生錯誤,就會被捕獲并且讓腳本繼續執行。然而,隨著應用程序規模的擴大,這種方式將變得無法管理。

ErrorHandler

Angular提供了一個默認的ErrorHandler,可以將錯誤消息打印到控制臺,因此可以攔截這個默認行為來添加自定義的處理邏輯,下面嘗試編寫錯誤處理類:

import { ErrorHandler, Injectable } from "@angular/core";
import { HttpErrorResponse } from "@angular/common/http";

@Injectable()
export class ErrorsHandler implements ErrorHandler {
  handleError(error: Error | HttpErrorResponse) {
    if (!navigator.onLine) {
      console.error("Browser Offline!");
    } else {
      if (error instanceof HttpErrorResponse) {
        if (!navigator.onLine) {
          console.error("Browser Offline!");
        } else {
          // Handle Http Error (4xx, 5xx, ect.)
          console.error("Http Error!");
        }
      } else {
        // Handle Client Error (Angular Error, ReferenceError...)
        console.error("Client Error!");
      }
      console.error(error);
    }
  }
}

通常在app下創建一個共享目錄shared,并將此文件放在providers文件夾中

現在,需要更改應用程序的默認行為,以使用我們自定義的類而不是ErrorHandler。修改app.module.ts文件,從@angular/core導入ErrorHandler,并將providers添加到@NgModule模塊,代碼如下:

import { NgModule, ErrorHandler } from "@angular/core";
import { BrowserModule } from "@angular/platform-browser";
import { FormsModule } from "@angular/forms";

// Providers
import { ErrorsHandler } from "./shared/providers/error-handler";

import { AppComponent } from "./app.component";

@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent],
  providers: [{ provide: ErrorHandler, useClass: ErrorsHandler }],
  bootstrap: [AppComponent]
})
export class AppModule {}

HttpInterceptor

HttpInterceptor提供了一種攔截HTTP請求/響應的方法,就可以在傳遞它們之前處理。例如,可以在拋出錯誤之前重試幾次HTTP請求。這樣,就可以優雅地處理超時,而不必拋出錯誤。

還可以在拋出錯誤之前檢查錯誤的狀態,使用攔截器,可以檢查401狀態錯誤碼,將用戶重定向到登錄頁面。

import { Injectable } from "@angular/core";
import { HttpEvent, HttpRequest, HttpHandler, HttpInterceptor, HttpErrorResponse } from "@angular/common/http";
import { Observable, throwError } from "rxjs";
import { retry, catchError } from "rxjs/operators";

@Injectable()
export class HttpsInterceptor implements HttpInterceptor {
  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).pipe(
      retry(1),
      catchError((error: HttpErrorResponse) => {
        if (error.status === 401) {
          // 跳轉到登錄頁面
        } else {
          return throwError(error);
        }
      })
    );
  }
}

同樣需要添加到app.module.ts

import { NgModule, ErrorHandler } from "@angular/core";
import { HTTP_INTERCEPTORS } from "@angular/common/http";
import { BrowserModule } from "@angular/platform-browser";
import { FormsModule } from "@angular/forms";

// Providers
import { ErrorsHandler } from "./shared/providers/error-handler";
import { HttpsInterceptor } from "./shared/providers/http-interceptor";

import { AppComponent } from "./app.component";

@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent],
  providers: [
    { provide: ErrorHandler, useClass: ErrorsHandler },
    { provide: HTTP_INTERCEPTORS, useClass: HttpsInterceptor, multi: true }
  ],
  bootstrap: [AppComponent]
})
export class AppModule {}

多提供者用于創建可擴展服務,其中系統帶有一些默認提供者,也可以注冊其他提供者。默認提供程序和其他提供程序的組合將用于驅動系統的行為。

Notifications

在控制臺打印錯誤日志對于開發者來說非常友好,但是對于用戶來說則需要一種更加友好的方式來告訴這些錯誤何時從GUI中發生。根據錯誤類型,推薦兩個組件:SnackbarDialog

  • Snackbar:推薦用于簡單的提示,比如表單缺少必填字段或通知用戶可預見的錯誤(無效電子郵件、用戶名太長等)。

  • Dialog:當存在未知的服務器端或客戶端錯誤時,推薦使用這種方式;通過這種方式,可以顯示更多的描述,甚至call-to-action,比如允許用戶輸入他們的電子郵件來跟蹤錯誤。

shared文件夾中添加一個服務來處理所有通知,新建services文件夾,創建文件:notification.service.ts,代碼如下:

import { Injectable } from "@angular/core";
import { MatSnackBar } from "@angular/material/snack-bar";

@Injectable({
  providedIn: "root"
})
export class NotificationService {
  constructor(public snackBar: MatSnackBar) {}

  showError(message: string) {
    this.snackBar.open(message, "Close", { panelClass: ["error"] });
  }
}

更新error-handler.ts,添加NotificationService

import { ErrorHandler, Injectable, Injector } from "@angular/core";
import { HttpErrorResponse } from "@angular/common/http";
// Services
import { NotificationService } from "../services/notification.service";

@Injectable()
export class ErrorsHandler implements ErrorHandler {
  //Error handling需要先加載,使用Injector手動注入服務
  constructor(private injector: Injector) {}
  handleError(error: Error | HttpErrorResponse) {
    const notifier = this.injector.get(NotificationService);
    if (!navigator.onLine) {
      //console.error("Browser Offline!");
      notifier.showError("Browser Offline!");
    } else {
      if (error instanceof HttpErrorResponse) {
        if (!navigator.onLine) {
          //console.error("Browser Offline!");
          notifier.showError(error.message);
        } else {
          // Handle Http Error (4xx, 5xx, ect.)
          // console.error("Http Error!");
          notifier.showError("Http Error: " + error.message);
        }
      } else {
        // Handle Client Error (Angular Error, ReferenceError...)
        // console.error("Client Error!");
        notifier.showError(error.message);
      }
      console.error(error);
    }
  }
}

如果在一個組件中拋出一個錯誤,可以看到一個很好的snackbar消息:

日志和錯誤跟蹤

當然不能期望用戶向報告每個bug,一旦部署到生產環境中,就不能看到任何控制臺日志。因此就需要能夠記錄錯誤的后端服務與自定義邏輯寫入數據庫或使用現有的解決方案,如RollbarSentryBugsnag

接下來創建一個簡單的錯誤跟蹤服務,創建logging.service.ts

import { Injectable } from "@angular/core";
import { HttpErrorResponse } from "@angular/common/http";

@Injectable({
  providedIn: "root"
})
export class LoggingService {
  constructor() {}

  logError(error: Error | HttpErrorResponse) {
    // This will be replaced with logging to either Rollbar, Sentry, Bugsnag, ect.
    if (error instanceof HttpErrorResponse) {
      console.error(error);
    } else {
      console.error(error);
    }
  }
}

將服務添加到error-handler.ts中:

import { ErrorHandler, Injectable, Injector } from "@angular/core";
import { HttpErrorResponse } from "@angular/common/http";
// Services
import { NotificationService } from "../services/notification.service";
import { LoggingService } from "../services/logging.service";

@Injectable()
export class ErrorsHandler implements ErrorHandler {
  //Error handling需要先加載,使用Injector手動注入服務
  constructor(private injector: Injector) {}
  handleError(error: Error | HttpErrorResponse) {
    const notifier = this.injector.get(NotificationService);
    const logger = this.injector.get(LoggingService);
    if (!navigator.onLine) {
      //console.error("Browser Offline!");
      notifier.showError("Browser Offline!");
    } else {
      if (error instanceof HttpErrorResponse) {
        if (!navigator.onLine) {
          //console.error("Browser Offline!");
          notifier.showError(error.message);
        } else {
          // Handle Http Error (4xx, 5xx, ect.)
          // console.error("Http Error!");
          notifier.showError("Http Error: " + error.message);
        }
      } else {
        // Handle Client Error (Angular Error, ReferenceError...)
        // console.error("Client Error!");
        notifier.showError(error.message);
      }
      // console.error(error);
      logger.logError(error);
    }
  }
}

到此,相信大家對“Angular中常用的錯誤處理方式有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

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

AI

庆阳市| 沙雅县| 泽州县| 石城县| 新巴尔虎左旗| 通城县| 五家渠市| 诸城市| 霍州市| 云南省| 南投县| 宁安市| 成武县| 横峰县| 柳州市| 昌宁县| 德保县| 光山县| 保靖县| 万州区| 荆州市| 平度市| 土默特右旗| 雅江县| 方城县| 建德市| 保定市| 彭阳县| 丹寨县| 新乡市| 晋州市| 琼中| 祁阳县| 通化市| 色达县| 平远县| 昌黎县| 南康市| 镇远县| 棋牌| 孙吴县|