Panic
📘 1. Panic là gì?
panic
trong Go là cơ chế xử lý lỗi nghiêm trọng, khiến chương trình:
Dừng thực thi tại điểm
panic
Chạy ngược lại stack và gọi
defer
(nếu có)In stack trace
Và thoát chương trình (trừ khi được recover)
🧠 Nó tương đương với throw trong các ngôn ngữ khác (như Java, JS, Python).
🔧 2. Cách sử dụng panic
func mayPanic() {
panic("something went wrong")
}
func main() {
fmt.Println("Start")
mayPanic()
fmt.Println("End") // không bao giờ được in
}
✅ Output:
Start
panic: something went wrong
goroutine 1 [running]:
main.mayPanic(...)
...
🛑 3. Cách phục hồi panic bằng recover
recover
func safeFunc() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered from panic:", r)
}
}()
panic("boom!")
}
func main() {
safeFunc()
fmt.Println("Program continues...")
}
⚙️ 4. Khi nào nên dùng panic?
✅ NÊN DÙNG khi gặp lỗi rất nghiêm trọng, không thể/không nên xử lý tiếp:
Lỗi vi phạm logic không thể khắc phục (ví dụ: nil pointer, corrupted state)
Lỗi từ
init()
khiến chương trình không thể khởi độngViết các assertion cho test
if user == nil {
panic("User must not be nil at this point")
}
❌ KHÔNG NÊN DÙNG PANIC để xử lý lỗi runtime thông thường
// ❌ Sai cách dùng
func readFile(path string) []byte {
data, err := os.ReadFile(path)
if err != nil {
panic(err) // KHÔNG nên panic ở đây
}
return data
}
👉 Với lỗi IO, mạng, DB... hãy trả
error
, không panic.
✅ Ưu điểm của panic
Dừng ngay lập tức
Ngăn chương trình tiếp tục khi gặp lỗi nghiêm trọng
Có stack trace
Dễ debug khi chương trình crash
Kết hợp với recover
Cho phép viết các sandbox
để xử lý lỗi mà không crash toàn chương trình
❌ Nhược điểm của panic
Khó kiểm soát flow
Làm flow control phức tạp, dễ bug nếu không recover
Không phù hợp với lỗi thường
Dễ bị lạm dụng thay vì dùng error
Tăng độ phức tạp
Cần viết nhiều defer/recover nếu dùng rộng rãi
Không an toàn cho thư viện
Thư viện public không nên gây panic ra ngoài
🧠 Kết luận theo kinh nghiệm Senior
Lỗi có thể xảy ra khi chạy (IO, input sai, v.v)
Dùng error
Lỗi không bao giờ nên xảy ra (nil object, logic bug)
Có thể panic
Trong lib hoặc framework public
KHÔNG panic ra ngoài, luôn return error
Trong test hoặc assert
Panic là hợp lý
Last updated