Phân Biệt Exception và Error Trong Lập Trình: Đừng Để "Lỗi" Thành "Ngoại Lệ"

Trong thế giới lập trình, hai khái niệm exception (ngoại lệ) và error (lỗi) là những thứ mà dân coder tụi mình phải nắm rõ nếu muốn code xịn sò, dễ bảo trì và không bị "chửi". Mới đây, Milan Jovanović có một chuỗi tweet khá hay ho về chủ đề này, nhấn mạnh rằng: exception là dành cho những tình huống ngoại lệ, còn error là những lỗi mà mình đã đoán trước được. Nghe thì đơn giản, nhưng hiểu đúng và áp dụng chuẩn thì không phải ai cũng làm được đâu nha!
Jovanović chốt hạ một câu cực chất: "exceptions are for exceptional situations" (ngoại lệ là dành cho những tình huống ngoại lệ). Câu này tóm gọn triết lý xử lý lỗi đúng chuẩn. Khi app của bạn rơi vào trạng thái "toang không cứu được", thì đó là lúc bạn nên quăng exception. Còn những lỗi mà bạn biết chắc sẽ xảy ra (kiểu như nhập sai mật khẩu, file không tồn tại, v.v.), thì phải xử lý nó trong code, đừng có quăng exception bừa bãi. Nếu không, code của bạn sẽ thành một mớ spaghetti khó hiểu, hiệu năng thì tụt dốc không phanh.

Java: Exception và Error, Ai Là Ai?

Để dễ hiểu hơn, mình lấy ví dụ trong Java nhé. Trong Java, error thường là những lỗi "toang nặng" mà JVM (Java Virtual Machine) quăng ra, kiểu như OutOfMemoryError (hết RAM) hay StackOverflowError (lỗi tràn stack). Những lỗi này thường không cứu được, chỉ có nước restart app.
Còn exception thì "nhẹ đô" hơn, và chia làm hai loại:
  • Checked exception: kiểu như IOException, bắt buộc bạn phải khai báo hoặc xử lý nó (dùng try/catch).
  • Unchecked exception: kiểu như RuntimeException, không bắt buộc phải khai báo, nhưng nếu không xử lý thì cũng dễ "toang".
Hiểu rõ hai loại này không chỉ để "lý thuyết suông", mà còn giúp bạn viết code gọn gàng, dễ debug hơn.

.NET: Xử Lý Exception Sao Cho Ngầu?

Qua bên .NET, cách xử lý exception cũng có bài bản riêng với try/catch/finally. Cái hay của cách này là bạn có thể xử lý lỗi một cách "êm đẹp", đồng thời giải phóng tài nguyên (kiểu như đóng file, ngắt kết nối database) trong block finally.
Một mẹo nhỏ: chỉ nên bắt những exception hiếm gặp, vì đó mới là lỗi "xịn". Còn những lỗi "dự đoán được" thì nên kiểm tra trước trong code, đừng để nó thành exception. Một số thư viện trong .NET còn cung cấp cách xử lý lỗi mà không cần quăng exception, rất hợp cho những app cần hiệu năng cao.

Đừng Dùng Exception Làm "Flow Control"!

Một lỗi phổ biến mà nhiều newbie (và cả một số senior coder) hay mắc phải là dùng exception để điều khiển luồng (flow control). Kiểu như thay vì kiểm tra điều kiện, họ quăng exception để "nhảy" qua đoạn code khác. Nghe thì có vẻ tiện, nhưng thực tế là nó làm code chậm đi đáng kể, vì việc tạo stack trace (dấu vết ngăn xếp) tốn kha khá tài nguyên.
Tuy nhiên, cũng có vài ngôn ngữ không có công cụ kiểm soát luồng ngon lành, nên đôi khi phải "chơi liều" dùng exception. Nhưng nhớ là chỉ dùng khi thật sự cần thiết thôi nha!

Phân Biệt Exception và Error: Tưởng Không Quan Trọng Mà Quan Trọng Không Tưởng

Việc phân biệt rõ exception và error không chỉ giúp code của bạn dễ đọc hơn, mà còn làm app "trâu bò" hơn. Khi bạn định nghĩa rõ ràng cái nào là "ngoại lệ", cái nào là "lỗi", thì việc quản lý lỗi sẽ dễ dàng hơn rất nhiều.
Jovanović cũng nhắc đến một điểm thú vị về kiến trúc phần mềm: nên bắt đầu với kiến trúc monolithic (nguyên khối) trước khi chuyển sang microservices. Dù không liên quan trực tiếp đến exception hay error, nhưng nó nhấn mạnh tầm quan trọng của sự đơn giản và ổn định trong giai đoạn đầu. Khi app phát triển, cách xử lý lỗi cũng cần thay đổi để phù hợp với những thách thức mới, đặc biệt là trong hệ thống phân tán.

Kết

Những chia sẻ của Milan Jovanović trong chuỗi tweet này là lời nhắc nhở quý giá cho dân coder tụi mình: hiểu rõ và áp dụng đúng cách xử lý exception và error là chìa khóa để viết code "đỉnh của chóp". Làm đúng thì app chạy mượt, người dùng vui, còn bạn thì đỡ bị sếp "gõ đầu". Vậy nên, đừng để "lỗi" thành "ngoại lệ" nhé!