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à throw
N và bị bắt ["catch
ed"] 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 cú ném
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World2. Cố gắng ném một đối tượng không dẫn đến lỗi nghiêm trọng của PHP.Throwable. 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à throw
N [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 "throw
5", 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 [throw
7]. Đ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 catch
6. Nếu một câu lệnh catch
6 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 catch
6 đượ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 catch
6, giá trị từ khối finally
được trả về.
Trình xử lý ngoại lệ toàn cầu
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ụ #1 Báo cáo lỗi chuyển đổi thành ngoại lệ
try
0
Ví dụ
Ví dụ #2 ném một ngoại lệ
try
1
try
2
try
3Ví dụ trên sẽ xuất ra:
0.2 Caught exception: Division by zero. Hello World
Ví dụ #3 Xử lý ngoại lệ với khối finally
try
1
try
2
try
7
Ví dụ trên sẽ xuất ra:
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World
Ví dụ #3 Xử lý ngoại lệ với khối finally
catch
0
catch
1
catch
2Ví dụ trên sẽ xuất ra:
Ví dụ #3 Xử lý ngoại lệ với khối finally
catch
3
catch
4
catch
5Ví dụ trên sẽ xuất ra:
Ví dụ #6 Xử lý ngoại lệ Multi Catch
catch
3
catch
4
catch
8Ví dụ trên sẽ xuất ra:
Ví dụ #7 bỏ qua biến bị bắt
Chỉ được phép trong Php 8.0.0 trở lên.
catch
9
finally
0
finally
1Ví dụ số 8 ném như một biểu thức
Chỉ được phép trong Php 8.0.0 trở lên.
catch
9
finally
0
finally
4Ví dụ số 8 ném như một biểu thức ¶
Hỏi tại Nilpo Dot Com ¶
finally
5
finally
6
finally
7
finally
813 năm trước ¶
Johan ¶
finally
9
catch
0
catch
111 năm trước ¶
Christof+php [at] insypro.com ¶
catch
2
catch
3
catch
4
catch
55 năm trước ¶
Shot [Piotr Szotkowski] ¶
catch
6
catch
7
catch
8
catch
114 năm trước ¶
Simo ¶
catch
0
7 năm trước ¶
Edu ¶
catch
1
catch
2
catch
3
catch
19 năm trước ¶
mlaopane tại gmail dot com ¶
catch
5
catch
6
catch
74 năm trước ¶
Christof+php [at] insypro.com ¶
catch
8
catch
9
catch
15 năm trước ¶
Shot [Piotr Szotkowski] ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World01
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World02
catch
114 năm trước ¶
Simo ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World04
7 năm trước ¶
Edu ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World05
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World06
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World07
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World08
9 năm trước ¶
mlaopane tại gmail dot com ¶
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World09
0.2 First finally. Caught exception: Division by zero. Second finally. Hello World10
catch
1