Hướng dẫn php throw exception with data - php ném ngoại lệ với dữ liệu

Bạn cần mở rộng lớp ngoại lệ:

_data = $data;
        parent::__construct($message);
    }

    public function getData()
    {
        return $this->_data;
    }
}

Khi ném:

error, $someData);
...

Và khi bắt được:

catch(ResponseException $e) {
    ...
    $data = $e->getData();
    ...
}

Thuộc tính động (không được khuyến nghị)

Xin lưu ý rằng điều này sẽ gây ra lỗi khấu hao trong Php 8.2 và sẽ ngừng hoạt động trong Php 9 theo một trong những Php RFC https://wiki.php.net/rfc/deprecate_dynamic_properiesnote that this will cause deprecation error in PHP 8.2 and will stop working in PHP 9 according to one of the PHP RFC https://wiki.php.net/rfc/deprecate_dynamic_properties

Khi OP hỏi về việc thực hiện nhiệm vụ này mà không mở rộng lớp Exception, bạn hoàn toàn có thể bỏ qua khai báo lớp ResponseException. Tôi thực sự không khuyên bạn nên làm theo cách này, trừ khi bạn có lý do thực sự mạnh mẽ (xem chủ đề này để biết thêm chi tiết: https://softwareEngineering.stackexchange.com/questions/186439/is-declaring-fields-on-classes-actal -HRAPFUL-IN-PHP)

Trong phần ném:

...
$e = new Exception('Exception message');
$e->data = $customData; // we're creating object property on the fly
throw $e;
...

Và khi bắt được:

catch(Exception $e) {
    $data = $e->data; // Access data property
}

Tháng 9 năm 2018 Chỉnh sửa: Vì một số độc giả thấy câu trả lời này hữu ích, tôi đã thêm một liên kết đến một câu hỏi tràn chồng khác giải thích các nhược điểm của việc sử dụng các thuộc tính được khai báo động.

11 năm trước

  • ResponseException8

Christof+php [at] insypro.com ¶

5 năm trước

Đố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ó.

error, $someData); ... 0

Khối

error, $someData);
...
0 xác định cách phản hồi ngoại lệ ném. Khối
error, $someData);
...
0 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

error, $someData);
...
0 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
error, $someData);
...
1) sẽ tiếp tục sau khối ____10 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
error, $someData);
...
0. Nếu không, việc thực thi sẽ tiếp tục sau khối
error, $someData);
...
0 đượ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 ____10 phù hợ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 "

...
$e = new Exception('Exception message');
$e->data = $customData; // we're creating object property on the fly
throw $e;
...
1", 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, khối

error, $someData);
...
0 có thể chỉ định nhiều ngoại lệ bằng cách sử dụng ký tự đường ống (
...
$e = new Exception('Exception message');
$e->data = $customData; // we're creating object property on the fly
throw $e;
...
3). Đ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 ____10 vẫn sẽ thực thi nhưng sẽ không có quyền truy cập vào đối tượng ném.

error, $someData); ... 4

Một khối

error, $someData);
...
4 cũng có thể được chỉ định sau hoặc thay vì các khối ____10. Mã trong khối
error, $someData);
...
4 sẽ luôn được thực thi sau các khối
error, $someData);
...
1 và
error, $someData);
...
0, bất kể ngoại lệ đã được ném 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

error, $someData);
...
4 và câu lệnh
catch(Exception $e) {
    $data = $e->data; // Access data property
}
2. Nếu một câu lệnh
catch(Exception $e) {
    $data = $e->data; // Access data property
}
2 gặp phải bên trong các khối
error, $someData);
...
1 hoặc
error, $someData);
...
0, khối
error, $someData);
...
4 vẫn sẽ được thực thi. Hơn nữa, câu lệnh
catch(Exception $e) {
    $data = $e->data; // Access data property
}
2 được đánh giá khi gặp phải, nhưng kết quả sẽ được trả về sau khi khối
error, $someData);
...
4 được thực thi. Ngoài ra, nếu khối
error, $someData);
...
4 cũng chứa câu lệnh
catch(Exception $e) {
    $data = $e->data; // Access data property
}
2, giá trị từ khối
error, $someData);
...
4 được trả về.

0.2 Caught exception: Division by zero. Hello World 2

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 ____10 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 ________ 11 -________ 10 với chức năng đó là ____10.set_exception_handler() function can set a function that will be called in place of a

error, $someData);
...
0 block if no other block is invoked. The effect is essentially the same as if the entire program were wrapped in a
error, $someData);
...
1-
error, $someData);
...
0 block with that function as the
error, $someData);
...
0.

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ệ

0.2
Caught exception: Division by zero.
Hello World
7

Ví dụ

Ví dụ #4 ném một ngoại lệ

0.2
Caught exception: Division by zero.
Hello World
8

0.2
Caught exception: Division by zero.
Hello World
9

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World
0

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

error, $someData);
...
4

0.2
Caught exception: Division by zero.
Hello World
8

0.2
Caught exception: Division by zero.
Hello World
9

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World
4

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

error, $someData);
...
4

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World
7

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World
8

0.2
First finally.
Caught exception: Division by zero.
Second finally.
Hello World
9

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

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

error, $someData);
...
4

Exception0

Exception1

Exception2

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

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

error, $someData);
...
4

Exception0

Exception1

Exception5

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

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

error, $someData);
...
4

Ví dụ #6 Tương tác giữa khối

error, $someData);
...
4 và
catch(Exception $e) {
    $data = $e->data; // Access data property
}
2

Exception6

Exception7

Exception8

Ví dụ #7 Ngoại lệ lồng nhau

Ví dụ #6 Tương tác giữa khối

error, $someData);
...
4 và
catch(Exception $e) {
    $data = $e->data; // Access data property
}
2

Exception6

Exception7

ResponseException1

Ví dụ #7 Ngoại lệ lồng nhau

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

ResponseException2

ResponseException3

ResponseException4

ResponseException5

Ví dụ #9 bỏ qua biến bị bắt

Chỉ được phép trong Php 8.0.0 trở lên.

ResponseException6

ResponseException7

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

Hỏi tại Nilpo Dot Com ¶

13 năm trước

ResponseException9

throw0

throw1

throw2

Johan ¶

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

throw3

throw4

throw5

ResponseException8

Ví dụ #9 bỏ qua biến bị bắt

Chỉ được phép trong Php 8.0.0 trở lên.

throw7

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

Hỏi tại Nilpo Dot Com ¶

throw8

throw9

error, $someData);
...
00

ResponseException8

13 năm trước

Johan ¶

error, $someData);
...
02

error, $someData);
...
03

error, $someData);
...
04

11 năm trước

5 năm trước

error, $someData);
...
05

error, $someData);
...
06

ResponseException8

Telefoontoestel tại Nospam Dot org ¶

8 năm trước

error, $someData);
...
08

error, $someData);
...
09

ResponseException8

Tom Polomsk ¶

7 năm trước

error, $someData);
...
11

Sawsan ¶

10 năm trước

error, $someData);
...
12

error, $someData);
...
13

error, $someData);
...
14

error, $someData);
...
15

Daan ¶

1 năm trước

error, $someData);
...
16

error, $someData);
...
17

ResponseException8