การจัดการ Error ใน Angular

Oct. 26, 2024 · boychawin

เดียวพามาจัดการ error ที่อาจเกิดขึ้นมีหลายรูปแบบ และบางครั้งเราอาจต้องการให้มีการจัดการข้อผิดพลาดที่ครอบคลุมทั่วทั้งแอป ไม่ใช่แค่เฉพาะบาง component หรือ service เท่านั้น Angular เองมีวิธีที่จะช่วยให้เราทำสิ่งนี้ได้ โดยการใช้คลาส ErrorHandler

งั้นเรามาสร้าง class CustomErrorHandler ของเราเองขึ้นมาใหม่พร้อมกับ implements ErrorHandler เพื่อจัดการข้อผิดพลาดทั้งหมดที่เกิดขึ้นภายในแอป เช่น ตรวจจับข้อผิดพลาดและแสดงข้อความในคอนโซลหรือจะทำเป็น popup เพื่อแจ้งเตือนผู้ใช้ก็ได้ โดยจะทำได้ด้วยการสร้างคลาส CustomErrorHandler

// global-error-handler.ts
import { ErrorHandler, Injectable, Injector } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class CustomErrorHandler implements ErrorHandler {
  constructor(private injector: Injector) {}

  handleError(error: Error | any): void {
    const errorMessage = error.message ? error.message : error.toString();
    
    if (errorMessage.includes('chunk')) {
      console.log('Chunk Error:', errorMessage);
    } else {
      console.log('General Error:', errorMessage);
    }

    throw error;  // ให้ Angular ทำการโยนข้อผิดพลาดเพื่อจัดการต่อเอง
  }
}

ในโค้ดด้านบน เราได้ใช้ console.log() เพื่อแสดงข้อความแตกต่างกันไปตามประเภทของข้อผิดพลาดที่พบ และใช้ throw error เพื่อโยนข้อผิดพลาดกลับไปให้ระบบของ Angular จัดการต่อ

การใช้งาน

หลังจากที่สร้าง CustomErrorHandler เสร็จแล้ว เราจะต้องทำการการเพิ่มใน AppModule เพื่อให้ Angular รู้ว่าเราต้องการให้ใช้คลาสนี้เป็นตัวจัดการข้อผิดพลาดหลัก

// app.module.ts
import { ErrorHandler } from '@angular/core';
import { CustomErrorHandler } from '../shared/error-handler/global-error-handler';

@NgModule({
  ...,
  providers: [
    {
      provide: ErrorHandler,
      useClass: CustomErrorHandler,
    },
  ],
  ...
})
export class AppModule {}

การทดสอบ

ใน AppComponent เราจะเพิ่มปุ่มที่มีฟังก์ชัน triggerError() ซึ่งจะทำการโยนข้อผิดพลาดเมื่อกดปุ่ม

// app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <h1>ทดสอบการจัดการข้อผิดพลาด</h1>
    <div>
      <button (click)="triggerError()">Trigger Error</button>
    </div>
  `,
})
export class AppComponent {
  triggerError() {
    throw new Error('Simulated error in AppComponent');
  }
}

เมื่อกดปุ่ม “Trigger Error” จะเกิดข้อผิดพลาดขึ้นและ CustomErrorHandler จะเข้ามาจัดการโดยการตรวจสอบและแสดงข้อความในคอนโซล โดยเราจะเห็นข้อความ General Error: Simulated error in AppComponent ในคอนโซล

สรุป

การใช้ CustomErrorHandler ใน Angular การจัดการข้อผิดพลาดทั่วทั้งแอป ซึ่งสามารถเพิ่มความยืดหยุ่นในการจัดการข้อผิดพลาดต่างๆ ได้เป็นอย่างดี และทำให้โค้ดสะอาดเรียบร้อยมากยิ่งขึ้น