Cách xử lý ngoại lệ trong PHP
Việc giải quyết tất cả lỗi và lỗi tiềm ẩn trong mã của bạn có vẻ như là một việc dễ dàng, nhưng trên thực tế không phải vậy. Thật khó để dự đoán mã của bạn sẽ hoạt động như thế nào, do đó bạn không thể viết mã để xử lý tất cả các lỗi tiềm ẩn xảy ra. Giải pháp đưa ra là viết trình xử lý ngoại lệ giúp chúng ta xác định rõ ràng những gì PHP nên làm nếu có vấn đề trong một khối mã. Trong bài viết này chúng ta cùng nhau tìm hiểu về cách xử lý ngoại lệ trong PHP.
Xem thêm:
Contents
Ngoại lệ là gì?
Ngoại lệ là một dấu hiệu cho biết một sự kiện đặc biệt hoặc xảy ra lỗi. Ngoại lệ do nguyên nhân khác nhau như: lỗi kết nối cơ sở dữ liệu, truy vấn dữ liệu không thành công, tệp mà bạn đang cố gắng truy cập không tồn tại… PHP cung cấp một cơ chế xử lý ngoại lệ mạnh mẽ cho phép bạn xử lý ngoại lệ hiệu quả. Xử lý ngoại lệ được sử dụng để thay đổi luồng thông thường của việc thực hiện mã nếu xảy ra một lỗi (ngoại lệ).
Dưới đây là những gì thường xảy ra khi một ngoại lệ được kích hoạt:
– Trạng thái mã hiện tại được lưu
– Việc thực hiện mã sẽ chuyển sang một hàm xử lý ngoại lệ do người dùng định nghĩa
– Tùy thuộc vào tình huống, trình xử lý có thể tiếp tục thực hiện mã, chấm dứt việc thực hiện tập lệnh hoặc tiếp tục thực hiện mã từ một vị trí khác trong mã
Một số phương pháp xử lý ngoại lệ:
– Sử dụng ngoại lệ cơ bản
– Tạo một trình xử lý ngoại lệ tùy chỉnh
– Nhiều ngoại lệ
– Ném ra một ngoại lệ
– Thiết lập một trình xử lý ngoại lệ mức cao nhất
Lưu ý: Ngoại lệ chỉ nên được sử dụng với điều kiện lỗi, và không nên được sử dụng để nhảy đến một vị trí khác trong mã tại một điểm quy định.
Sử dụng ngoại lệ cơ bản
Khi ngoại lệ được ném ra, những đoạn mã sau nó sẽ không được thực hiện, và PHP sẽ cố gắng tìm khối “catch” phù hợp. Nếu một ngoại lệ không được xử lý, sẽ xảy ra một lỗi nghiêm trọng với một thông báo “Uncaught Exception”.
Chúng ta hãy thử ném một ngoại lệ mà không được xử lý:
Đoạn mã trên sẽ xảy ra lỗi như sau:
Try, throw và catch
Để tránh lỗi từ ví dụ trên, chúng ta cần phải tạo ra mã thích hợp để xử lý ngoại lệ.
Mã xử lý ngoại lệ bao gồm:
– Try – đoạn mã có khả năng xảy ra ngoại lệ nằm trong khối “try”. Nếu không xảy ra ngoại lệ mã sẽ tiếp tục như bình thường. Tuy nhiên nếu xảy ra ngoại lệ thì một ngoại lệ sẽ được ném ra.
– Throw – Ngoại lệ được kích hoạt. Mỗi “throw” phải bao gồm ít nhất một khối “catch”.
– Catch – lấy ra một ngoại lệ và tạo ra một đối tượng chứa thông tin ngoại lệ.
Đoạn mã trên sẽ hiển thị ra thông báo sau:
1. Hàm checkNum() kiểm tra nếu một số lớn hơn 1. Nếu điều kiện đúng ngoại lệ được ném ra
2. Hàm checkNum() được gọi trong khối “try”
3. Ngoại lệ trong hàm checkNum() được ném ra
4. Khối “catch” lấy ra ngoại lệ và tạo ra một đối tượng ($e) chứa thông tin ngoại lệ
5. Thông báo lỗi từ ngoại lệ được lặp lại bằng cách gọi $ e-> getMessage() từ đối tượng ngoại lệ.
Xử lý nhiều ngoại lệ
Chúng ta có thể sử dụng nhiều ngoại lệ trong mã để kiểm tra cho nhiều điều kiện.
Chúng ta có thể sử dụng các câu lệnh điều khiển như if…else, switch, hoặc các ngoại lệ lồng nhau. Những ngoại lệ này sử dụng các lớp ngoại lệ khác nhau và trả về các thông báo lỗi khác nhau
Đoạn mã trên kiểm tra hai điều kiện và ném ra ngoại lệ nếu không điều kiện nào đúng.
– Lớp ngoại lệ customException() được tạo ra như một phần mở rộng của lớp ngoại lệ cũ. Theo cách này nó thừa hưởng tất cả các phương pháp và thuộc tính từ lớp ngoại lệ cũ.
– Hàm errorMessage() được tạo ra. Hàm này trả lại thông báo lỗi nếu địa chỉ email không hợp lệ
– Biến $email dùng để lưu địa chỉ email hợp lệ
– Khối “try” được thực hiện và ngoại lệ không bị ném ra trong điều kiện đầu tiên
– Điều kiện thứ hai gây ra ngoại lệ vì email chứa chuỗi “example”
– Khối “catch” xử lý ngoại lệ và thông báo ra lỗi phù hợp.
Quy tắc xử lý ngoại lệ
– Mã có thể được đặt trong khối try giúp bắt các trường hợp xảy ra ngoại lệ.
– Mỗi khối try hoặc throw phải có ít nhất một khối catch tương ứng
– Nhiều khối catch được sử dụng để bắt các lớp ngoại lệ khác nhau
Một nguyên tắc đơn giản: nếu bạn ném thứ gì đó, bạn phải bắt nó.