本篇內容主要講解“Angular中常用的錯誤處理方式有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Angular中常用的錯誤處理方式有哪些”吧!
成都創(chuàng)新互聯(lián)公司專注于虎丘企業(yè)網站建設,成都響應式網站建設公司,商城建設?;⑶鹁W站建設公司,為虎丘等地區(qū)提供建站服務。全流程按需定制設計,專業(yè)設計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務
Angualr
是一款來自谷歌的開源的 web 前端框架,誕生于 2009 年,由 Misko Hevery 等人創(chuàng)建,后為 Google 所收購。是一款優(yōu)秀的前端 JS 框架,已經被用于 Google 的多款產品當中。
AngularJS 是基于聲明式編程模式 是用戶可以基于業(yè)務邏輯進行開發(fā). 該框架基于HTML的內容填充并做了雙向數據綁定從而完成了自動數據同步機制. 最后, AngularJS 強化的DOM操作增強了可測試性.
最熟悉的的方式,就是在代碼中添加try/catch
塊,在try
中發(fā)生錯誤,就會被捕獲并且讓腳本繼續(xù)執(zhí)行。然而,隨著應用程序規(guī)模的擴大,這種方式將變得無法管理。
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
下創(chuàng)建一個共享目錄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
提供了一種攔截HTTP請求/響應的方法,就可以在傳遞它們之前處理。例如,可以在拋出錯誤之前重試幾次HTTP請求。這樣,就可以優(yōu)雅地處理超時,而不必拋出錯誤。
還可以在拋出錯誤之前檢查錯誤的狀態(tài),使用攔截器,可以檢查401狀態(tài)錯誤碼,將用戶重定向到登錄頁面。
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, next: HttpHandler): Observable > { 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 {}
多提供者用于創(chuàng)建可擴展服務,其中系統(tǒng)帶有一些默認提供者,也可以注冊其他提供者。默認提供程序和其他提供程序的組合將用于驅動系統(tǒng)的行為。
在控制臺打印錯誤日志對于開發(fā)者來說非常友好,但是對于用戶來說則需要一種更加友好的方式來告訴這些錯誤何時從GUI中發(fā)生。根據錯誤類型,推薦兩個組件:Snackbar
和Dialog
Snackbar
:推薦用于簡單的提示,比如表單缺少必填字段或通知用戶可預見的錯誤(無效電子郵件、用戶名太長等)。
更新 如果在一個組件中拋出一個錯誤,可以看到一個很好的 當然不能期望用戶向報告每個 接下來創(chuàng)建一個簡單的錯誤跟蹤服務,創(chuàng)建 將服務添加到 到此,相信大家對“Angular中常用的錯誤處理方式有哪些”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!Dialog
:當存在未知的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
,一旦部署到生產環(huán)境中,就不能看到任何控制臺日志。因此就需要能夠記錄錯誤的后端服務與自定義邏輯寫入數據庫或使用現有的解決方案,如Rollbar
、Sentry
、Bugsnag
。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中常用的錯誤處理方式有哪些
URL標題:http://weahome.cn/article/psccsc.html