一文了解Angular中處理錯誤的方式
Angular中可以如何處理錯誤?這篇文章帶大家了解Angular中的錯誤處理的機制,介紹處理錯誤的方式。
錯誤處理是編寫程式碼經常遇見的並且必須處理的需求,很多時候處理異常的邏輯是為了避免程式的崩潰,下面來一起看看 Angular
處理錯誤的方式。 【相關教學推薦:《angular教學》】
什麼是Angular
Angualr
是一款來自Google的開源的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發生。根據錯誤類型,推薦兩個元件:Snackbar
和Dialog
#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
,一旦部署到生產環境中,就不能看到任何控制台日誌。因此就需要能夠記錄錯誤的後端服務與自訂邏輯寫入資料庫或使用現有的解決方案,如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中處理錯誤的方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

使用中間件改善Go函數中的錯誤處理:引入中間件的概念,它可以攔截函數呼叫並執行特定邏輯。建立錯誤處理中間件,該中間件將錯誤處理邏輯包裝在自訂函數中。使用中間件包裝處理程序函數,以便在函數呼叫之前執行錯誤處理邏輯。根據錯誤類型返回適當的錯誤代碼,улучшениеобработкиошибоквфункцияхGoспомощьюпромежуто намсосредоточитьсянаобработкеошибо

在C++中,異常處理透過try-catch區塊優雅地處理錯誤,常見的異常類型包括執行時間錯誤、邏輯錯誤和超出界限錯誤。以檔案開啟錯誤處理為例,當程式開啟檔案失敗時,它會拋出異常,並透過catch區塊列印錯誤訊息和傳回錯誤程式碼,從而在不終止程式的情況下處理錯誤。異常處理提供錯誤處理集中化、錯誤傳遞和程式碼健全性等優勢。

PHP中最佳的錯誤處理工具和庫包括:內建方法:set_error_handler()和error_get_last()第三方工具包:Whoops(調試和錯誤格式化)第三方服務:Sentry(錯誤報告和監控)第三方庫: PHP-error-handler(自訂錯誤日誌記錄和堆疊追蹤)和Monolog(錯誤日誌記錄處理器)

C++類別設計中的錯誤處理和日誌記錄包括:異常處理:捕獲並處理異常,使用自訂異常類別提供特定錯誤訊息。錯誤碼:使用整數或枚舉表示錯誤條件,在回傳值中傳回。斷言:驗證預置和後置條件,不成立時引發異常。 C++函式庫日誌:使用std::cerr和std::clog進行基本日誌記錄。外部日誌庫:整合第三方庫以獲得高級功能,如等級過濾和日誌檔案旋轉。自訂日誌類:建立自己的日誌類,抽象底層機制,提供通用介面記錄不同等級資訊。

在Go函數中,非同步錯誤處理透過使用error通道,非同步地從goroutine傳遞錯誤。具體步驟如下:建立一個error頻道。啟動一個goroutine來執行操作並非同步發送錯誤。使用select語句從通道接收錯誤。非同步處理錯誤,例如列印或記錄錯誤訊息。此方法可以提高並發程式碼的效能和可擴展性,因為錯誤處理不會阻塞呼叫線程,並且可以取消執行。

在Go函數單元測試中,錯誤處理有兩種主要策略:1.將錯誤表示為error類型的具體值,用於斷言預期值;2.使用通道向測試函數傳遞錯誤,適用於測試並發程式碼。實戰案例中,使用錯誤值策略確保函數對負數輸入回傳0。

在Golang中,錯誤包裝器允許你在原始錯誤上追加上下文訊息,從而創建新錯誤。這可用於統一不同程式庫或元件拋出的錯誤類型,簡化偵錯和錯誤處理。步驟如下:使用errors.Wrap函數將原有錯誤包裝成新錯誤。新錯誤包含原始錯誤的上下文資訊。使用fmt.Printf輸出包裝後的錯誤,提供更多上下文和可操作性。在處理不同類型的錯誤時,使用errors.Wrap函數統一錯誤類型。

Go中優雅地處理錯誤有兩種方法:defer語句用於在函數傳回前執行程式碼,通常用於釋放資源或記錄錯誤。 recover語句用於捕獲函數中的panic,並允許程式以更優雅的方式處理錯誤,而不是崩潰。
