Trước phiên bản 7, trình phân tích cú pháp PHP thường báo cáo lỗi khi gặp phải các điều kiện khác nhau. Mỗi lỗi thường thuộc về một loại đã được định nghĩa trước. PHP 7 đã thay đổi cơ chế báo cáo lỗi. Thay vì báo cáo lỗi theo cách truyền thống, hầu hết các lỗi hiện nay được báo cáo bằng cách ném ra các ngoại lệ lỗi.
Cơ chế xử lý ngoại lệ trong PHP tương tự như nhiều ngôn ngữ khác, và được thực hiện với các từ khóa try, catch, throw và finally .
Exceptions trong PHP thực hiện Throwable interface . Giao diện Throwable đóng vai trò là cơ sở cho bất kỳ đối tượng nào có thể được ném thông qua câu lệnh throw, bao gồm các đối tượng Error và Exception.
Một lớp do người dùng định nghĩa không thể triển khai giao diện Throwable trực tiếp. Thay vào đó, để khai báo một lớp ngoại lệ do người dùng định nghĩa, nó phải kế thừa từ Exception class .
Mã PHP có thể gây ra ngoại lệ được bao quanh trong một khối try . Một đối tượng ngoại lệ sẽ được ném ra nếu nó được tìm thấy, nhằm tạo điều kiện cho việc bắt các ngoại lệ tiềm năng. Mỗi khối try phải có ít nhất một khối catch hoặc finally . Hơn nữa, có thể có nhiều khối catch/finally tương ứng với một khối try .
try { // throw errors in the try-block // if an error occurs we can throw an exception throw new Exception('this is an error.'); } catch(Exception $e) { // catch the throws in the catch-block // do something with the exception object, eg. // display its message echo 'Error message: ' .$e->getMessage(); }
Nếu một ngoại lệ được ném ra và không có khối catch , ngoại lệ sẽ "nổi lên" cho đến khi tìm thấy một khối catch phù hợp. Nếu ngăn xếp gọi bị cuốn lại đến phạm vi toàn cục mà không gặp khối catch phù hợp, một trình xử lý ngoại lệ toàn cục sẽ được gọi (nếu nó được thiết lập), nếu không, chương trình sẽ kết thúc với một lỗi nghiêm trọng.
Hàm này thiết lập trình xử lý ngoại lệ mặc định nếu một ngoại lệ không được bắt trong khối try/catch. Sau khi callback được thực thi, chương trình sẽ dừng lại.
set_exception_handler(?callable $callback): ?callable
Tham số $callback là tên của hàm sẽ được gọi khi xảy ra một ngoại lệ không được xử lý. Hàm này phải được định nghĩa trước khi gọi set_exception_handler(). Hàm xử lý này cần phải chấp nhận một tham số, đó sẽ là đối tượng ngoại lệ đã được ném ra.
Hàm này trả về tên của bộ xử lý ngoại lệ đã được định nghĩa trước đó, hoặc NULL nếu có lỗi. Nếu không có bộ xử lý nào được định nghĩa trước, NULL cũng sẽ được trả về.
Hãy xem xét ví dụ sau đây −
<?php function handler($ex) { echo "Uncaught exception is : " , $ex->getMessage(), "\n"; } set_exception_handler('handler'); throw new Exception('Not Found Exception'); echo "not included Executed\n"; ?>
Nó sẽ tạo ra output −
Uncaught exception is : Not Found Exception
Thư viện PHP chuẩn chứa các ngoại lệ đã được định nghĩa sẵn -
Sr.No | Predefined Exceptions |
---|---|
1 | LogicException Exception that represents error in the program logic. |
2 | BadFunctionCallException Exception thrown if a callback refers to an undefined function or if some arguments are missing. |
3 | BadMethodCallException Exception thrown if a callback refers to an undefined method or if some arguments are missing. |
4 | DomainException Exception thrown if a value does not adhere to a defined valid data domain. |
5 | InvalidArgumentException Exception thrown if an argument is not of the expected type. |
6 | LengthException Exception thrown if a length is invalid. |
7 | OutOfRangeException Exception thrown when an illegal index was requested. |
8 | RuntimeException Exception thrown if an error which can only be found on runtime occurs. |
9 | OutOfBoundsException Exception thrown if a value is not a valid key. |
10 | OverflowException Exception thrown when adding an element to a full container. |
11 | RangeException Exception thrown to indicate range errors during program execution. An arithmetic error other than under/overflow. |
12 | UnderflowException Exception thrown when performing an invalid operation on an empty container, such as removing an element. |
13 | UnexpectedValueException Exception thrown if a value does not match with a set of values. |
Bạn có thể định nghĩa một lớp ngoại lệ tùy chỉnh mở rộng từ lớp ngoại lệ cơ bản. Đoạn mã sau định nghĩa một lớp ngoại lệ tùy chỉnh có tên là myException. Loại ngoại lệ này sẽ được ném ra nếu giá trị của $num nhỏ hơn 0 hoặc lớn hơn 100.
Phương thức getMessage() của lớp Exception trả về thông báo lỗi và phương thức getLine() trả về số dòng mã trong đó ngoại lệ xuất hiện.
<?php class myException extends Exception { function message() { return "error : ". $this->getMessage(). "in line no". $this->getLine(); } } $num=125; try { if ($num>100 || $num<0) throw new myException("$num is invalid number"); else echo "$num is a valid number"; } catch (myException $m) { echo $m->message(); } ?>
Chạy đoạn mã trên với $num=125 và $num=90 để nhận được một thông báo lỗi và một thông báo về số hợp lệ.
error : 125 is invalid number in line no 10