Ngoại lệ lấy dấu vết php

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

  1. Khi một
    Exception in ...:...
    Stack trace:
    #0 ...(...): test('123456789012345...')
    1 bị buộc thành chuỗi, chẳng hạn như
    Exception in ...:...
    Stack trace:
    #0 ...(...): test('123456789012345...')
    2 hoặc
    Exception in ...:...
    Stack trace:
    #0 ...(...): test('123456789012345...')
    3
  2. Khi một
    Exception in ...:...
    Stack trace:
    #0 ...(...): test('123456789012345...')
    1 được truy xuất dưới dạng chuỗi, với
    Exception in ...:...
    Stack trace:
    #0 ...(...): test('123456789012345...')
    5, tôi. e.
    Exception in ...:...
    Stack trace:
    #0 ...(...): test('123456789012345...')
    6
  3. 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
25
0 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
25
1 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
25
2 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

  1. Có một số trường hợp ngoại lệ?
  2. 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
  3. 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

Ngoại lệ lấy dấu vết php

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
25
3

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
25
4