Hướng dẫn php throw exception in catch - php ném ngoại lệ trong bắt

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 trycatch, 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

try3

Ví 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

try7

Ví 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

catch2

Ví dụ trên sẽ xuất ra:

Ví dụ #5 Xử lý ngoại lệ với khối finally

catch3

catch4

catch5

Ví dụ trên sẽ xuất ra:

Ví dụ #8 Xử lý ngoại lệ Multi Catch

catch3

catch4

catch8

Ví 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

finally1

Ví 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

finally4

Ví dụ số 10 ném như một biểu thức

Hỏi tại Nilpo Dot Com ¶

finally5

finally6

finally7

finally8

13 năm trước

Johan ¶

finally9

catch0

11 năm trước

catch1

Christof+php [at] insypro.com ¶

catch2

catch3

catch4

catch5

5 năm trước

Shot (Piotr Szotkowski) ¶

catch6

catch7

catch8

catch1

14 năm trước

Simo ¶

catch0

7 năm trước

Edu ¶

catch1

catch2

catch3

catch1

9 năm trước

mlaopane tại gmail dot com ¶

catch5

catch6

catch7

4 năm trước

Christof+php [at] insypro.com ¶

catch8

catch9

catch1

5 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

catch1

14 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
08

9 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

Chúng ta có thể ném ngoại lệ từ Catch Block PHP không?

Việc sử dụng cơ bản các ngoại lệ Khi một ngoại lệ được ném, mã sau đó sẽ không được thực thi và PHP sẽ cố gắng tìm khối "bắt" phù hợp. Nếu một ngoại lệ không bị bắt, một lỗi gây tử vong sẽ được đưa ra với một thông báo "ngoại lệ chưa được thực hiện".When an exception is thrown, the code following it will not be executed, and PHP will try to find the matching "catch" block. If an exception is not caught, a fatal error will be issued with an "Uncaught Exception" message.

Chúng ta có thể ném ngoại lệ trong bắt không?

Khi một ngoại lệ được lưu trữ trong một khối bắt, bạn có thể ném lại nó bằng cách sử dụng từ khóa ném (được sử dụng để ném các đối tượng ngoại lệ). Hoặc, bọc nó trong một ngoại lệ mới và ném nó.you can re-throw it using the throw keyword (which is used to throw the exception objects). Or, wrap it within a new exception and throw it.

Làm thế nào tôi có thể bắt được ngoại lệ trong PHP?

Bởi vì các ngoại lệ là các đối tượng, tất cả chúng đều mở rộng một lớp ngoại lệ tích hợp (xem các ngoại lệ ném vào PHP), điều đó có nghĩa là việc bắt mọi ngoại lệ PHP đều đơn giản như loại đối tượng ngoại lệ toàn cầu, được biểu thị bằng cách thêm dấu gạch chéo ngược vàophía trước: thử {// ...} Catch (\ ngoại lệ $ e) {// ...}type-hinting the global exception object, which is indicated by adding a backslash in front: try { // ... } catch ( \Exception $e ) { // ... }

Có ném một php trả lại ngoại lệ?

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 bắt 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 một thông báo "ngoại lệ không bị tổn thương ...", trừ khi một trình xử lý đã được xác định với set_exception_handler ().. If an exception is not caught, a PHP Fatal Error will be issued with an " Uncaught Exception ... " message, unless a handler has been defined with set_exception_handler().