Giới thiệu
Interface Throwable được triển khai bởi class Error và Exception. Tất cả các class Error định nghĩa sẵn kế thừa từ class Error. Instance của class Error tương ứng được ném bên trong block try và xử lý bên trong catch block phù hợp.
Ném Error (Exception)
Thực thi bình thường (khi không có exception ném trong try block) sẽ tiếp tục sau catch block cuối cùng được định nghĩa trong chuỗi.
Ví dụ: Exception tùy chỉnh
<?php
function div($x, $y) {
if (!$y) {
throw new Exception('Division by zero.');
}
return $x / $y;
}
try {
echo div(10, 5) . "\n";
echo div(10, 0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Tiếp tục thực thi
echo "Execution continues\n";
?>
Kết quả
2 Caught exception: Division by zero. Execution continues
Ví dụ: TypeError
Trong ví dụ sau, TypeError được ném khi thực thi hàm vì đối số không phù hợp được truyền:
<?php
function add(int $num1, int $num2) {
return $num1 + $num2;
}
try {
$value = add(1, 'one');
} catch (TypeError $e) {
echo $e->getMessage() . "\n";
}
?>
Kết quả
Argument 2 passed to add() must be of the type integer, string given
SPL Exceptions (Ngoại lệ thư viện chuẩn)
Thư viện chuẩn PHP (SPL) chứa các exception định nghĩa sẵn:
| Exception | Mô tả |
|---|---|
| LogicException | Exception biểu diễn lỗi trong logic chương trình. |
| BadFunctionCallException | Ném nếu callback tham chiếu hàm không định nghĩa hoặc thiếu đối số. |
| BadMethodCallException | Ném nếu callback tham chiếu method không định nghĩa hoặc thiếu đối số. |
| DomainException | Ném nếu giá trị không tuân theo miền dữ liệu hợp lệ định nghĩa. |
| InvalidArgumentException | Ném nếu đối số không phải kiểu mong đợi. |
| LengthException | Ném nếu độ dài không hợp lệ. |
| OutOfRangeException | Ném khi index không hợp lệ được yêu cầu. |
| RuntimeException | Ném nếu lỗi chỉ tìm thấy tại runtime. |
| OutOfBoundsException | Ném nếu giá trị không phải key hợp lệ. |
| OverflowException | Ném khi thêm phần tử vào container đầy. |
| RangeException | Chỉ thị lỗi phạm vi trong thực thi. Lỗi số học trừ under/overflow. |
| UnderflowException | Ném khi thực hiện phép toán không hợp lệ trên container rỗng (vd: xóa phần tử). |
| UnexpectedValueException | Ném nếu giá trị không khớp với tập giá trị định nghĩa. |
Ví dụ: OutOfBoundsException
<?php
$arr = array("one"=>1, "two"=>2, "three"=>3, "four"=>4);
$key = "ten";
try {
if (array_key_exists($key, $arr) == FALSE) {
throw new OutOfBoundsException("key not found");
} else {
echo $arr[$key];
}
} catch (OutOfBoundsException $e) {
echo $e->getMessage() . "\n";
}
?>
Kết quả
key not found