Lập trình 22/09/2026 7 phút

Error model của gRPC: status code chuẩn và details có cấu trúc thay cho chuỗi lỗi mơ hồ

Trả về error là một chuỗi text thì client phải đoán xem có nên retry không, lỗi do input hay do server. gRPC có bộ status code chuẩn giải quyết điều đó. Bài này chạy thật: server trả InvalidArgument kèm details có cấu trúc (field nào sai), NotFound, và OK; client đọc code để quyết định tự động — retry với Unavailable, bỏ với InvalidArgument. Code là ngôn ngữ chung máy hiểu, hơn hẳn một dòng text.

Go 11/07/2026 11 phút

Log lỗi ở mọi tầng là bốn dòng cho một sự cố — chỉ tầng ngoài cùng được log

Một lỗi đi lên như một sự việc leo thang qua các cấp: mỗi cấp thêm ngữ cảnh nó biết rồi đẩy lên, chỉ cấp trên cùng lập một biên bản và ra một câu trả lời. Bọc ở đâu, log ở đâu, tách lỗi nghiệp vụ khỏi lỗi hệ thống, và đừng để lộ nội tình ra API.

Go 08/07/2026 10 phút

panic không phải throw, recover không phải catch — và panic trong goroutine giết cả chương trình

panic như nút DỪNG KHẨN của máy: dành cho hỏng hóc cấu trúc chứ không phải chi tiết không vừa, chạy trình tắt rồi ngừng. recover chỉ làm việc từ chòi điều khiển (defer), và mỗi goroutine phải tự lo nút của mình. Ba chỗ được phép panic, ba chỗ được phép recover.