Error handling
Error handling: Thành thạo cách xử lý lỗi trong Go (error wrapping, custom errors, panic/recover).
🎯 Tư duy về Error trong Go
Go không có exception như Java. Thay vào đó, error là một giá trị (
error
là một interface).Error trong Go phải được kiểm soát có chủ đích, không thể lờ đi.
Không dùng panic để xử lý lỗi logic thông thường.
1. 📦 Kiểu error cơ bản
Sử dụng:
2. 🎨 Custom error types
Tạo error có ngữ cảnh riêng và phân loại lỗi:
Xử lý:
3. 🧩 Error Wrapping (fmt.Errorf
, errors.Join
, errors.Unwrap
)
fmt.Errorf
, errors.Join
, errors.Unwrap
)Go 1.13+ hỗ trợ error wrapping để giữ lại ngữ cảnh lỗi gốc:
a. Wrapping error
b. Unwrap và check loại lỗi
4. 🪓 Panic & Recover – Dùng đúng lúc
❌ Không dùng panic trong logic nghiệp vụ
✅ Dùng panic cho exception không recover được: vi phạm hợp đồng, lỗi dev (not user)
⚠️ Recover dùng để chặn hệ thống sập
5. 📌 Best Practices từ Senior
✅ Luôn trả lỗi, không panic:
✅ Phân loại lỗi: dùng custom error type hoặc sentinel error
✅ Logging lỗi ở layer cao nhất (ex: handler, main) – tránh log trùng nhiều tầng.
✅ Đừng nuốt lỗi:
6. 📁 Mô hình hoá Error theo tầng ứng dụng
repo
layer: returnErrNotFound
,ErrDB
, custom errorsservice
layer: wrap lại với contexthandler
layer: phân tích lỗi và trả HTTP status tương ứng
7. 🧪 Unit test với error
Kết
Ghi log lỗi rõ ràng
log
, zap
, logrus
Theo dõi lỗi production
Sentry
, Honeybadger
, OpenTelemetry
Gỡ lỗi, trace
pprof
, panic/recover
, errors.Wrap
Viết error semantic rõ ràng
Custom errors, errors.Is/As/Unwrap
Last updated