PHP - ngoại lệ (Exceptions)

Giao diện Throwable

Trong PHP, ngoại lệ là các đối tượng đại diện cho các điều kiện ngoại lệ. Chúng được ném ra khi một lỗi cụ thể xảy ra trong mã của bạn. PHP cung cấp giao diện Throwable, là lớp cơ bản cho tất cả các ngoại lệ và lỗi. Nó có nhiều phương thức cho phép bạn xử lý ngoại lệ một cách hiệu quả.

PHP - Exceptions

Xử lý ngoại lệ cơ bản

Để xử lý ngoại lệ trong PHP, bạn có thể sử dụng khối try-catch. Dưới đây là một ví dụ:

<?php
try {
// Mã có thể ném ra một ngoại lệ
throw new Exception("Một lỗi đã xảy ra!");
} catch (Exception $e) {
// Mã để xử lý ngoại lệ
echo "Đã bắt được ngoại lệ: " . $e->getMessage();
}
?>

Trong ví dụ này, chúng ta sử dụng lệnh throw để tạo một đối tượng Exception mới với một thông báo tùy chỉnh. Nếu một ngoại lệ được ném ra trong khối try, việc thực thi mã nhảy đến khối catch tương ứng, nơi ngoại lệ được bắt và xử lý.

set_exception_handler

Hàm set_exception_handler cho phép bạn xác định một hàm tùy chỉnh sẽ được gọi mỗi khi một ngoại lệ không bắt được được ném ra. Hàm này nên nhận hai tham số: đối tượng ngoại lệ và một boolean chỉ định liệu ngoại lệ có được ném ra trong một cuộc gọi đến eval() hay không.

Dưới đây là một ví dụ về cách sử dụng set_exception_handler:

<?php
function myExceptionHandler($exception) {
echo "Ngoại lệ không bắt được: " . $exception->getMessage();
}

set_exception_handler('myExceptionHandler');

// Mã ném ra một ngoại lệ
throw new Exception("Oops! Something went wrong.");
?>

Trong ví dụ này, chúng ta xác định một hàm xử lý ngoại lệ tùy chỉnh叫做 myExceptionHandler. Sau đó, chúng ta sử dụng set_exception_handler để đặt hàm này làm bộ xử lý ngoại lệ mặc định. Khi một ngoại lệ không bắt được được ném ra, hàm tùy chỉnh của chúng ta sẽ được gọi thay vì bộ xử lý mặc định.

Ngoại lệ SPL

PHP cung cấp nhiều lớp ngoại lệ内置 trong Thư viện PHP Tiêu chuẩn (SPL). Các lớp này kế thừa lớp Exception và cung cấp thông tin cụ thể hơn về các loại ngoại lệ khác nhau. Một số ngoại lệ SPL phổ biến bao gồm:

  • BadFunctionCallException: Được ném ra khi một hàm callback tham chiếu đến một hàm không xác định hoặc nếu thiếu một số đối số.
  • DomainException: Sử dụng cho lỗi trong logic miền của ứng dụng của bạn.
  • InvalidArgumentException: Được nâng lên khi một hàm nhận được một đối số mà nó không chấp nhận.
  • LengthException: Sử dụng khi một thao tác cố gắng sử dụng một đối tượng có độ dài sai.
  • OutOfBoundsException: Được ném ra khi chỉ số mảng nằm ngoài giới hạn.
  • OutOfRangeException: Được nâng lên khi một giá trị không nằm trong phạm vi mong đợi.
  • RangeException: Sử dụng khi một giá trị không nằm trong phạm vi xác định.
  • RuntimeException: Ngoại lệ mục đích tổng quát cho lỗi thời gian chạy.
  • UnderflowException: Được ném ra khi một trường hợp tràn xuống xảy ra (ví dụ: trừ từ một stack trống).
  • UnexpectedValueException: Được nâng lên khi một giá trị không khớp với loại mong đợi.

Bạn có thể sử dụng các ngoại lệ SPL trong mã của mình như bất kỳ lớp ngoại lệ nào khác. Ví dụ:

<?php
function divide($a, $b) {
if ($b == 0) {
throw new DivisionByZeroError("Phân chia cho không không được phép.");
}
return $a / $b;
}

try {
echo divide(10, 0);
} catch (DivisionByZeroError $e) {
echo "Đã bắt được ngoại lệ: " . $e->getMessage();
}
?>

Ngoại lệ tùy chỉnh

Ngoài việc sử dụng các ngoại lệ SPL内置, bạn cũng có thể tạo các lớp ngoại lệ tùy chỉnh của riêng mình. Để làm điều này, chỉ cần kế thừa lớp Exception và thêm bất kỳ chức năng bổ sung nào bạn cần. Dưới đây là một ví dụ:

<?php
class MyCustomException extends Exception {
public function __construct($message, $code = 0, Exception $previous = null) {
parent::__construct($message, $code, $previous);
}
}

try {
throw new MyCustomException("Đây là một ngoại lệ tùy chỉnh.");
} catch (MyCustomException $e) {
echo "Đã bắt được ngoại lệ tùy chỉnh: " . $e->getMessage();
}
?>

Trong ví dụ này, chúng ta tạo một lớp mới叫做 MyCustomException kế thừa lớp Exception. Sau đó, chúng ta ném và bắt một thể hiện của ngoại lệ tùy chỉnh như bất kỳ ngoại lệ nào khác.

Bằng cách tuân theo các hướng dẫn này và sử dụng các công cụ được cung cấp, bạn có thể xử lý ngoại lệ trong mã PHP của mình một cách hiệu quả và đảm bảo rằng ứng dụng của bạn mạnh mẽ và kiên cố trước các lỗi không mong muốn. Nhớ luôn kiểm tra mã của bạn kỹ lưỡng và xử lý ngoại lệ một cách từ tốn để cung cấp trải nghiệm người dùng tốt hơn.

Credits: Image by storyset