Trong phát triển Web/App, việc xử lý lỗi (Error Handling) và kiểm tra dữ liệu (Validation) thường bị xem nhẹ cho đến khi ứng dụng gặp sự cố trên môi trường production. Một hệ thống xử lý lỗi hời hợt không chỉ gây khó khăn cho lập trình viên khi debug mà còn tạo ra trải nghiệm tồi tệ cho người dùng. 1. Tư duy 'Phòng bệnh hơn chữa bệnh' với Validation Đừng bao giờ tin tưởng dữ liệu từ phía client. Validation cần được thực hiện ở cả hai lớp: - Frontend Validation: Mục đích là cung cấp phản hồi tức thì (Instant Feedback). Ví dụ: Khi người dùng nhập email thiếu ký tự '@', hãy hiển thị cảnh báo ngay lập tức thay vì đợi gửi request lên server rồi mới báo lỗi. Điều này giảm tải cho server và tăng tốc độ tương tác. - Backend Validation: Đây là chốt chặn cuối cùng và bắt buộc. Ngay cả khi Frontend đã check, Backend vẫn phải validate lại để ngăn chặn các request độc hại hoặc bypass từ Postman/Curl. 2. Cấu trúc phản hồi lỗi nhất quán (Standardized Error Response) Sai lầm phổ biến là mỗi API trả về một định dạng lỗi khác nhau. Hãy thống nhất một cấu trúc JSON cho mọi lỗi để Frontend dễ dàng xử lý. Ví dụ thực tế về cấu trúc phản hồi: { "success": false, "error": { "code": "INVALID_INPUT", "message": "Dữ liệu nhập vào không hợp lệ", "details": [ { "field": "phone_number", "issue": "Số điện thoại phải có 10 chữ số" } ] } } 3. Phân loại mã lỗi (HTTP Status Codes) đúng cách Đừng trả về 200 OK cho mọi request rồi ghi 'error' trong body. Hãy tận dụng HTTP Status Codes: - 400 Bad Request: Lỗi cú pháp hoặc validation. - 401 Unauthorized: Chưa xác thực (chưa login). - 403 Forbidden: Đã login nhưng không có quyền truy cập tài nguyên này. - 404 Not Found: Tài nguyên không tồn tại. - 422 Unprocessable Entity: Dữ liệu đúng định dạng nhưng không hợp lệ về mặt logic nghiệp vụ. - 500 Internal Server Error: Lỗi hệ thống (cần được log lại chi tiết ở backend nhưng không hiển thị chi tiết cho người dùng). 4. Lời khuyên áp dụng - Sử dụng Middleware: Thay vì viết try-catch ở mọi controller, hãy xây dựng một Global Error Handler Middleware để bắt tất cả các exception và format chúng về chuẩn chung. - Tránh leak thông tin nhạy cảm: Tuyệt đối không trả về Stack Trace (chi tiết dòng code bị lỗi) cho người dùng cuối vì đây là lỗ hổng bảo mật nghiêm trọng. - User-friendly messages: Thay vì báo 'NullPointerException at line 45', hãy báo 'Hệ thống đang gặp sự cố tạm thời, vui lòng thử lại sau'.