การจัดการข้อผิดพลาดทั่วทั้งแอป
ดักจับและแปลงข้อผิดพลาด HTTP จากศูนย์กลาง
การจัดการข้อผิดพลาดทั่วทั้งแอป เป็นบทเรียน Angular Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Angular Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Angular Academy มีบทเรียนทั้งหมด 4 บทเรียน
การจัดการข้อผิดพลาดจากส่วนกลาง
แทนที่จะดักจับข้อผิดพลาด HTTP ในทุกคอมโพเนนต์ อินเตอร์เซปเตอร์สามารถจัดการจากส่วนกลางได้ เช่น บันทึกข้อผิดพลาด แสดงการแจ้งเตือน เปลี่ยนเส้นทางเมื่อเกิด 401 หรือปรับรูปแบบข้อผิดพลาดให้เป็นมาตรฐาน
catchError ในอินเตอร์เซปเตอร์
ส่งสตรีม next(req) ผ่าน catchError เพื่อดักจับความล้มเหลว
import { catchError, throwError } from 'rxjs';
import { HttpErrorResponse } from '@angular/common/http';
export const errorInterceptor: HttpInterceptorFn = (req, next) =>
next(req).pipe(
catchError((err: HttpErrorResponse) => {
console.error('HTTP error', err.status);
return throwError(() => err);
})
);การตรวจสอบ HttpErrorResponse
HttpErrorResponse มี status, message และเนื้อหาข้อผิดพลาดของเซิร์ฟเวอร์ใน error ให้ตรวจสอบ status เพื่อจัดการแต่ละกรณี
catchError((err: HttpErrorResponse) => {
if (err.status === 0) console.error('network/CORS error');
else console.error('server error', err.status);
return throwError(() => err);
})เปลี่ยนเส้นทางเมื่อเกิด 401
โดยทั่วไป 401 หมายถึงเซสชันหมดอายุ ให้เปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบจากอินเตอร์เซปเตอร์
export const errorInterceptor: HttpInterceptorFn = (req, next) => {
const router = inject(Router);
return next(req).pipe(
catchError((err: HttpErrorResponse) => {
if (err.status === 401) router.navigate(['/login']);
return throwError(() => err);
})
);
};การแสดงการแจ้งเตือน
ฉีดบริการการแจ้งเตือนเพื่อแสดงข้อผิดพลาดแก่ผู้ใช้อย่างสม่ำเสมอ
export const errorInterceptor: HttpInterceptorFn = (req, next) => {
const toast = inject(ToastService);
return next(req).pipe(
catchError((err: HttpErrorResponse) => {
toast.error(err.error?.message ?? 'Something went wrong');
return throwError(() => err);
})
);
};การส่งข้อผิดพลาดซ้ำกับการกลืนข้อผิดพลาด
โดยทั่วไปควรส่งข้อผิดพลาดซ้ำด้วย throwError(() => err) เพื่อให้คอมโพเนนต์ยังตอบสนองได้ ควรคืนค่าออบเซอร์เวเบิลสำรอง (เช่น of(null)) เฉพาะเมื่อต้องการซ่อนข้อผิดพลาดจากผู้เรียกจริง ๆ
การปรับข้อผิดพลาดให้เป็นมาตรฐาน
แปลงเนื้อหาข้อผิดพลาดจากเซิร์ฟเวอร์ที่มีหลายรูปแบบให้เป็นโครงสร้างข้อผิดพลาดของแอปที่สอดคล้องกันก่อนส่งข้อผิดพลาดซ้ำ เพื่อให้การจัดการในส่วนถัดไปง่ายขึ้น
catchError((err: HttpErrorResponse) => {
const appError = {
code: err.status,
message: err.error?.message ?? err.message
};
return throwError(() => appError);
})การแยกข้อผิดพลาดฝั่งไคลเอ็นต์กับฝั่งเซิร์ฟเวอร์
err.error instanceof ErrorEvent (หรือ err.status === 0) บ่งชี้ว่าเป็นข้อผิดพลาดฝั่งไคลเอ็นต์/เครือข่าย มิฉะนั้นแบ็กเอนด์จะส่งสถานะข้อผิดพลาดกลับมา ให้จัดการทั้งสองกรณีแตกต่างกัน
หลีกเลี่ยงการจัดการซ้ำ
หากอินเตอร์เซปเตอร์แสดงการแจ้งเตือนแล้ว คอมโพเนนต์ก็ไม่ควรแสดงการแจ้งเตือนซ้ำสำหรับข้อผิดพลาดเดียวกัน ควรเลือกชั้นเดียวสำหรับการจัดการที่ผู้ใช้มองเห็น เพื่อหลีกเลี่ยงข้อความซ้ำ
การบันทึกไปยังบริการตรวจสอบระบบ
อินเตอร์เซปเตอร์ส่วนกลางเป็นจุดที่เหมาะสำหรับส่งต่อข้อผิดพลาดไปยังเครื่องมือตรวจสอบระบบ (เช่น Sentry) พร้อมแนบบริบทของคำขอ
export const errorInterceptor: HttpInterceptorFn = (req, next) => {
const monitor = inject(MonitoringService);
return next(req).pipe(
catchError((err: HttpErrorResponse) => {
monitor.captureHttpError(req.url, err.status, err.message);
return throwError(() => err);
})
);
};การจัดลำดับอินเตอร์เซปเตอร์ข้อผิดพลาด
วางอินเตอร์เซปเตอร์ข้อผิดพลาดให้ครอบอินเตอร์เซปเตอร์อื่น เพื่อให้ดักจับข้อผิดพลาดจากทั้งสายโซ่ได้ รวมถึงข้อผิดพลาดจากการลองใหม่
provideHttpClient(
withInterceptors([authInterceptor, retryInterceptor, errorInterceptor])
)ตรวจสอบความเข้าใจอย่างรวดเร็ว
ทดสอบความเข้าใจเกี่ยวกับการจัดการข้อผิดพลาดจากส่วนกลางของคุณ
สรุป: การจัดการข้อผิดพลาดจากส่วนกลาง
อินเตอร์เซปเตอร์ข้อผิดพลาดรวมการจัดการความล้มเหลวของ HTTP ไว้ที่ศูนย์กลาง
- ใช้
catchErrorกับnext(req) - ตรวจสอบ
HttpErrorResponse.status(เช่น เปลี่ยนเส้นทางเมื่อเกิด 401) - ส่งข้อผิดพลาดซ้ำเพื่อให้คอมโพเนนต์ตอบสนองได้ และกลืนข้อผิดพลาดเฉพาะเมื่อมีเจตนาเช่นนั้น
ถัดไป: การลองใหม่และตัวบ่งชี้การโหลด
คำถามที่พบบ่อย
บทเรียน “การจัดการข้อผิดพลาดทั่วทั้งแอป” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดการข้อผิดพลาดทั่วทั้งแอป” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Angular Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Angular Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดการข้อผิดพลาดทั่วทั้งแอป”
ดักจับและแปลงข้อผิดพลาด HTTP จากศูนย์กลาง คุณปฏิบัติ Angular Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Angular Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Angular Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดการข้อผิดพลาดทั่วทั้งแอป” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Angular Academy นี้ได้ไหม
ได้ บทเรียน Angular Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ตัวสกัดกั้นแบบฟังก์ชัน
- การเพิ่มส่วนหัวการยืนยันตัวตน
- การจัดการข้อผิดพลาดทั่วทั้งแอป
- การลองใหม่และตัวบ่งชี้การโหลด