Các ngoại lệ được ném vào PHP có thể tùy chọn in thông tin ngoại lệ trên màn hình hoặc trả về một chuỗi có ngoại lệ, bao gồm cả dấu vết ngăn xếp
function test[] {
try {
throw new \Exception[];
}
catch [Exception $ex] {
echo $ex;
}
}
test['1234567890123456789];
Exception in ...:...
Stack trace:
#0 ...[...]: test['123456789012345...']
Theo mặc định, độ dài của các tham số trong theo dõi ngăn xếp được cắt ngắn thành 15 byte, theo sau là ...
. Lưu ý cách dòng bị cắt ngắn thành 15 byte, theo sau là dấu chấm lửng
test['123456789012345...']
Trong PHP7. 4, một cài đặt INI mới có tên zend.exception_ignore_args
đã được thêm vào, cài đặt này có thể ẩn hoàn toàn thông tin tham số khỏi dấu vết ngăn xếp
zend.exception_ignore_args=false
Một lệnh INI như trên sẽ ẩn hoàn toàn các tham số trong dấu vết ngăn xếp
Trong PHP8. 0, có một lệnh INI mới để giới hạn độ dài của các tham số được hiển thị trong dấu vết ngăn xếp. Lưu ý rằng lệnh zend.exception_ignore_args
vẫn có thể ẩn hoàn toàn thông tin tham số khỏi dấu vết ngăn xếp
zend.exception_string_param_max_len=42
Lệnh hơi dài nhưng rõ ràng này có thể mở rộng dấu vết ngăn xếp để hiển thị thêm thông tin trong dấu vết ngăn xếp. Chúng có thể giúp dễ dàng gỡ lỗi vì độ dài tối đa 15 byte thường không đủ cho các URL [ví dụ: ______41_______ đã là 12 byte, chỉ còn lại ba byte cho phần còn lại], truy vấn cơ sở dữ liệu, v.v.
Để ngăn cấu hình bị định cấu hình sai ghi hoặc xuất quá nhiều dữ liệu do thay đổi này, có giới hạn cố định là 1000000 byte đối với lệnh này
Lưu ý rằng thay đổi này chỉ ảnh hưởng khi một Throwable
[xem phân cấp các ngoại lệ PHP] bị ép buộc thành một
Exception in ...:...
Stack trace:
#0 ...[...]: test['123456789012345...']
0, được truy xuất rõ ràng dưới dạng một chuỗi hoặc khi một ngoại lệ chưa được bắt gặp được in trên màn hình- Khi một
1 bị buộc thành chuỗi, chẳng hạn nhưException in ...:... Stack trace: #0 ...[...]: test['123456789012345...']
2 hoặcException in ...:... Stack trace: #0 ...[...]: test['123456789012345...']
3Exception in ...:... Stack trace: #0 ...[...]: test['123456789012345...']
- Khi một
1 được truy xuất dưới dạng chuỗi, vớiException in ...:... Stack trace: #0 ...[...]: test['123456789012345...']
5, tôi. e.Exception in ...:... Stack trace: #0 ...[...]: test['123456789012345...']
6Exception in ...:... Stack trace: #0 ...[...]: test['123456789012345...']
- Lỗi mặc định được in trên màn hình khi không bắt được ngoại lệ
Thay đổi này không ảnh hưởng đến hàm
Exception in ...:...
Stack trace:
#0 ...[...]: test['123456789012345...']
7 hoặc phương thức Exception in ...:...
Stack trace:
#0 ...[...]: test['123456789012345...']
8 vì cả hai đều trả về dấu vết ngăn xếp đầy đủTác động tương thích ngược
Giá trị cấu hình mặc định của
Exception in ...:...
Stack trace:
#0 ...[...]: test['123456789012345...']
9 vẫn là test['123456789012345...']
0 byte. Điều này có nghĩa là trừ khi giá trị này không được cập nhật, dấu vết ngăn xếp sẽ giống nhau [PHP 5, PHP 7, PHP 8]
Ngoại lệ. getTrace - Nhận dấu vết ngăn xếp
Sự miêu tả
final public Exception::getTrace [ ] : array
Thông số
Chức năng này không có tham số
Giá trị trả về
Trả về dấu vết ngăn xếp ngoại lệ dưới dạng một mảng
ví dụ
Ví dụ #1 Ngoại lệ. getTrace[] ví dụ
getTrace[]]; } ?>
Ví dụ trên sẽ xuất ra một cái gì đó tương tự như
array[1] { [0]=> array[4] { ["file"]=> string[22] "/home/bjori/tmp/ex.php" ["line"]=> int[7] ["function"]=> string[4] "test" ["args"]=> array[0] { } } }
Khi báo cáo lỗi cho một ngoại lệ hoặc hành vi sai trong mã, điều quan trọng là bạn phải cung cấp một hoặc một số dấu vết ngăn xếp. Để hiểu tại sao, trước tiên bạn phải hiểu dấu vết ngăn xếp là gì và nó có thể hữu ích như thế nào đối với bạn với tư cách là nhà phát triển và cả những người bảo trì thư viện
Dấu vết ngăn xếp được gọi như vậy vì nó cho phép người ta nhìn thấy dấu vết của các lệnh gọi hàm dẫn đến một điểm trong mã kể từ khi bắt đầu chương trình. Điểm đó không nhất thiết phải là một ngoại lệ. Chẳng hạn, bạn có thể sử dụng hàm PHP gốc debug_print_backtrace[]
để lấy dấu vết như vậy. Đối với mỗi dòng trong theo dõi, bạn nhận được một tệp và một lệnh gọi hàm hoặc phương thức và số dòng cho lệnh gọi đó. Điều này thường giúp ích rất nhiều cho việc hiểu luồng chương trình của bạn và cách chương trình có thể kết thúc ở những nơi không mong muốn, chẳng hạn như các dòng mã nơi các ngoại lệ được đưa ra
Trong PHP, mọi ngoại lệ đều có dấu vết ngăn xếp của riêng nó, được hiển thị theo mặc định nếu ngoại lệ không bị bắt. Khi sử dụng Symfony, các ngoại lệ như vậy sẽ đi qua một trình xử lý ngoại lệ tùy chỉnh, giúp tăng cường chúng theo nhiều cách khác nhau trước khi hiển thị chúng theo API Máy chủ hiện tại [CLI hoặc không]. Điều này có nghĩa là cách tốt hơn để lấy dấu vết ngăn xếp khi bạn không cần chương trình tiếp tục là đưa ra một ngoại lệ, như sau. throw new \Exception[];
Khi các ứng dụng trở nên lớn hơn, sự phức tạp thường được xử lý bằng các lớp kiến trúc cần được tách biệt. Ví dụ: nếu bạn có một ứng dụng web thực hiện lệnh gọi tới một API từ xa, thì có thể tốt hơn nếu bạn bọc các ngoại lệ được đưa ra khi thực hiện lệnh gọi đó với các ngoại lệ có ý nghĩa đặc biệt trong miền của bạn và xây dựng các ngoại lệ HTTP thích hợp từ các ngoại lệ đó. Các ngoại lệ có thể được lồng vào nhau bằng cách sử dụng đối số $previous
xuất hiện trong chữ ký của lớp Exception
.
$ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
0 Điều này có nghĩa là đôi khi, khi bạn nhận được một ngoại lệ từ một ứng dụng, bạn thực sự có thể nhận được một vài trong số đóKhi sử dụng thư viện, bạn sẽ gọi mã mà bạn không viết. Khi dùng framework thì ngược lại. bởi vì bạn tuân theo các quy ước của khung, khung tìm thấy mã của bạn và gọi nó, đồng thời thực hiện trước mọi việc cho bạn, chẳng hạn như định tuyến hoặc kiểm soát truy cập. Symfony vừa là framework vừa là thư viện các thành phần, nó gọi mã của bạn và sau đó mã của bạn có thể gọi nó. Điều này có nghĩa là bạn sẽ luôn có ít nhất 2 phần, thường là 3 trong dấu vết ngăn xếp của bạn khi sử dụng Symfony. một phần bắt đầu ở một trong các điểm đầu vào của khung [trong hầu hết các trường hợp là ____19_______1 hoặc ____19_______2] và kết thúc khi đạt được mã của bạn, hầu hết trong một lệnh hoặc trong một bộ điều khiển được tìm thấy dưới ____19_______3. Sau đó, ngoại lệ được đưa vào mã của bạn hoặc trong các thư viện mà bạn gọi. Nếu là phần sau, thì phải có phần thứ ba trong theo dõi ngăn xếp với các lệnh gọi được thực hiện trong các tệp dưới tên
$ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
4. Trước khi đến thư mục đó, mã sẽ trải qua nhiều quy trình xem xét và quy trình CI, điều đó có nghĩa là mã này sẽ ít có khả năng trở thành nguồn gốc của vấn đề hơn so với mã từ ứng dụng của bạn, vì vậy, điều quan trọng là trước tiên bạn nên tập trung vào các dòng bắt đầu bằng $ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
3, Tiếp theo, bạn có thể xem những gói có liên quan. Các tệp trong
$ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
4 được Composer sắp xếp theo cách sau. $ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
7 trong đó $ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
8 là nhà cung cấp, $ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
9 thư viện và 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 250 gói Composer. Nếu bạn định báo cáo lỗi, hãy đảm bảo báo cáo lỗi đó với thư viện để đưa ra ngoại lệ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 251 sẽ dẫn bạn đến đúng nơi cho điều đó. Vì Symfony là một kho lưu trữ đơn lẻ, hãy sử dụng
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 252 khi báo cáo lỗi cho bất kỳ thành phần nào
Bây giờ chúng ta đã có tất cả những điều này, hãy xem cách lấy dấu vết ngăn xếp với Symfony
Một số điều cần được chú ý khi chọn theo dõi ngăn xếp từ môi trường phát triển của bạn thông qua trình duyệt web
- Có một số trường hợp ngoại lệ?
- Trong tab "Dấu vết ngăn xếp", bạn sẽ tìm thấy các ngoại lệ ở dạng văn bản thuần túy để bạn có thể dễ dàng chia sẻ chúng trong e. g. báo cáo lỗi. Đảm bảo xóa mọi thông tin nhạy cảm trước khi thực hiện
- Bạn cũng có thể nhận thấy có một tab nhật ký; . Chúng có thể có hoặc không liên quan đến ngoại lệ mà bạn đang nhận được, nhưng không phải là thuật ngữ "dấu vết ngăn xếp" đề cập đến
Vì dấu vết ngăn xếp có thể chứa dữ liệu nhạy cảm nên chúng không được để lộ trong quá trình sản xuất. Nhận dấu vết ngăn xếp từ môi trường sản xuất của bạn, mặc dù liên quan nhiều hơn, nhưng vẫn có thể thực hiện được với các giải pháp bao gồm nhưng không giới hạn việc gửi chúng đến địa chỉ email bằng Monolog
Ngoại lệ có thể xảy ra khi chạy lệnh Symfony. Theo mặc định, chỉ có thông báo được hiển thị vì nó thường đủ để hiểu chuyện gì đang xảy ra
1 2 3 4 5 6 7 8 9 10 11 12 13 14
$ php bin/console debug:exception
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
Nếu không phải như vậy, bạn có thể có được dấu vết ngăn xếp bằng cách tăng mức độ chi tiết với
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 253
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
$ php bin/console --verbose debug:exception
In Application.php line 644:
[Symfony\Component\Console\Exception\CommandNotFoundException]
Command "debug:exception" is not defined.
Did you mean one of these?
debug:autowiring
debug:config
debug:container
debug:event-dispatcher
debug:form
debug:router
debug:translation
debug:twig
Exception trace:
at /app/vendor/symfony/console/Application.php:644
Symfony\Component\Console\Application->find[] at /app/vendor/symfony/framework-bundle/Console/Application.php:116
Symfony\Bundle\FrameworkBundle\Console\Application->find[] at /app/vendor/symfony/console/Application.php:228
Symfony\Component\Console\Application->doRun[] at /app/vendor/symfony/framework-bundle/Console/Application.php:82
Symfony\Bundle\FrameworkBundle\Console\Application->doRun[] at /app/vendor/symfony/console/Application.php:140
Symfony\Component\Console\Application->run[] at /app/bin/console:42
Khi nhận được một ngoại lệ từ API, bạn có thể không nhận được dấu vết ngăn xếp hoặc nó có thể được hiển thị theo cách không phù hợp để chia sẻ. May mắn thay, khi ở trong môi trường nhà phát triển, bạn có thể có được dấu vết ngăn xếp văn bản thuần túy bằng cách sử dụng trình lược tả. Để tìm hồ sơ, bạn có thể xem tiêu đề phản hồi
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 254