Mục lục
- Mở rộng ngoại lệ
PHP có một mô hình ngoại lệ tương tự như các ngôn ngữ lập trình khác. Một ngoại lệ có thể là throwN và bị bắt ("catched") trong PHP. Mã có thể được bao quanh trong một khối try, để tạo điều kiện cho việc bắt các ngoại lệ tiềm năng. Mỗi try phải có ít nhất một khối catch hoặc finally tương ứng.
Nếu một ngoại lệ được ném và phạm vi chức năng hiện tại của nó không có khối catch, thì ngoại lệ sẽ "bong bóng lên" ngăn xếp cuộc gọi đến hàm gọi cho đến khi tìm thấy khối catch phù hợp. Tất cả finally khối mà nó gặp trên đường đi sẽ được thực thi. Nếu ngăn xếp cuộc gọi không được chứng minh tất cả các phạm vi toàn cầu mà không gặp phải khối ____3 phù hợp, chương trình sẽ chấm dứt với một lỗi nghiêm trọng trừ khi một trình xử lý ngoại lệ toàn cầu đã được đặt.
Đối tượng ném phải là một thể hiện của lớp ngoại lệ hoặc một lớp ngoại lệ. Cố gắng ném một đối tượng không dẫn đến lỗi nghiêm trọng của PHP.Exception class or a subclass of Exception. Trying to throw an object that is not will result in a PHP Fatal Error.
Kể từ Php 8.0.0, từ khóa throw là một biểu thức và có thể được sử dụng trong bất kỳ ngữ cảnh biểu thức nào. Trong các phiên bản trước đó là một tuyên bố và được yêu cầu phải ở trên dòng riêng của nó.
catch
Khối catch xác định cách phản ứng với một ngoại lệ ném. Khối catch xác định một hoặc nhiều loại ngoại lệ hoặc lỗi mà nó có thể xử lý và tùy chọn là một biến để gán ngoại lệ. .
Nhiều khối catch có thể được sử dụng để bắt các lớp ngoại lệ khác nhau. Thực thi bình thường (khi không có ngoại lệ nào được ném trong khối try) sẽ tiếp tục sau khối catch cuối cùng được xác định theo trình tự. Các trường hợp ngoại lệ có thể là throwN (hoặc cảm ứng lại) trong một khối catch. Nếu không, việc thực thi sẽ tiếp tục sau khối catch được kích hoạt.
Khi một ngoại lệ được ném, mã theo câu lệnh sẽ không được thực thi và PHP sẽ cố gắng tìm khối catch khớp đầu tiên. Nếu một ngoại lệ không bị bắt, một lỗi nghiêm trọng của PHP sẽ được đưa ra với thông báo "throw4", trừ khi một trình xử lý đã được xác định với set_exception_handler ().set_exception_handler().
Kể từ Php 7.1.0, một khối catch có thể chỉ định nhiều ngoại lệ bằng cách sử dụng ký tự đường ống (throw6). Điều này rất hữu ích cho khi các ngoại lệ khác nhau từ các phân cấp lớp khác nhau được xử lý giống nhau.
Kể từ Php 8.0.0, tên biến cho một ngoại lệ bị bắt là tùy chọn. Nếu không được chỉ định, khối catch vẫn sẽ thực thi nhưng sẽ không có quyền truy cập vào đối tượng ném.
finally
Một khối finally cũng có thể được chỉ định sau hoặc thay vì các khối catch. Mã trong khối finally sẽ luôn được thực thi sau các khối try và catch, bất kể ngoại lệ có bị ném hay không và trước khi thực hiện bình thường tiếp tục.
Một tương tác đáng chú ý là giữa khối finally và câu lệnh catch5. Nếu một câu lệnh catch5 gặp phải bên trong các khối try hoặc catch, khối finally vẫn sẽ được thực thi. Hơn nữa, câu lệnh catch5 được đánh giá khi gặp phải, nhưng kết quả sẽ được trả về sau khi khối finally được thực thi. Ngoài ra, nếu khối finally cũng chứa câu lệnh catch5, giá trị từ khối finally được trả về.
try5
Nếu một ngoại lệ được phép bong bóng lên phạm vi toàn cầu, nó có thể bị bắt bởi một trình xử lý ngoại lệ toàn cầu nếu được đặt. Hàm set_exception_handler () có thể đặt hàm sẽ được gọi thay cho khối catch nếu không có khối nào được gọi. Hiệu ứng về cơ bản giống như khi toàn bộ chương trình được bọc trong khối ________ 4 -________ 3 với chức năng đó là catch.set_exception_handler() function can set a function that will be called in place of a catch block if no other block is invoked. The effect is essentially the same as if the entire program were wrapped in a try-catch block with that function as the catch.
Ghi chú
Ghi chú::
Các hàm PHP nội bộ chủ yếu sử dụng báo cáo lỗi, chỉ các tiện ích mở rộng hướng đối tượng hiện đại sử dụng các ngoại lệ. Tuy nhiên, các lỗi có thể dễ dàng được dịch sang các ngoại lệ với errorException. Kỹ thuật này chỉ hoạt động với các lỗi không gây tử vong, tuy nhiên.
Ví dụ #3 Chuyển đổi báo cáo lỗi thành ngoại lệ
try0
Ví dụ
Ví dụ #4 ném một ngoại lệ
try1
try2
try3Ví dụ trên sẽ xuất ra:
0.2 Caught exception: Division by zero. Hello World
Ví dụ #5 Xử lý ngoại lệ với khối finally
try1
try2
try7Ví dụ trên sẽ xuất ra:
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World
Ví dụ #5 Xử lý ngoại lệ với khối finally
catch0
catch1
catch2Ví dụ trên sẽ xuất ra:
Ví dụ #5 Xử lý ngoại lệ với khối finally
catch3
catch4
catch5Ví dụ trên sẽ xuất ra:
Ví dụ #8 Xử lý ngoại lệ Multi Catch
catch3
catch4
catch8Ví dụ trên sẽ xuất ra:
Ví dụ #9 bỏ qua biến bị bắt
Chỉ được phép trong Php 8.0.0 trở lên.
catch9
finally0
finally1Ví dụ số 10 ném như một biểu thức
Chỉ được phép trong Php 8.0.0 trở lên.
catch9
finally0
finally4Ví dụ số 10 ném như một biểu thức ¶
Hỏi tại Nilpo Dot Com ¶
finally5
finally6
finally7
finally813 năm trước ¶
Johan ¶
finally9
catch0
11 năm trướccatch1 ¶
Christof+php [at] insypro.com ¶
catch2
catch3
catch4
catch55 năm trước ¶
Shot (Piotr Szotkowski) ¶
catch6
catch7
catch8
catch114 năm trước ¶
Simo ¶
catch0
7 năm trước ¶
Edu ¶
catch1
catch2
catch3
catch19 năm trước ¶
mlaopane tại gmail dot com ¶
catch5
catch6
catch74 năm trước ¶
Christof+php [at] insypro.com ¶
catch8
catch9
catch15 năm trước ¶
Shot (Piotr Szotkowski) ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 01
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 02
catch114 năm trước ¶
Simo ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 04
7 năm trước ¶
Edu ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 05
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 06
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 07
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 089 năm trước ¶
mlaopane tại gmail dot com ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 09
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World 10
catch1