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

  • 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

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 động

  • Viế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

Ưu điểm
Giải thích

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

Nhược điểm
Giải thích

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

Trường hợp
Xử lý

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