2009-12-22 27 views
19

Tôi đang sử dụng getTraceAsString() để nhận dấu vết ngăn xếp nhưng chuỗi đang bị cắt bớt vì một lý do nào đó.Làm cách nào tôi có thể nhận được chuỗi đầy đủ getTraceAsString() của PHP?

Ví dụ, một ngoại lệ được ném và tôi đăng nhập chuỗi sử dụng:

catch (SoapFault $e) { 
error_log($e->getTraceAsString()) 
} 

thats chuỗi in ra là:

# 0 C: \ Somedirectory \ Somedirectory \ Somedirectory \ Somedir \ SomeScript.php (10): SoapClient-> SoapClient ('http://www.ex ...')

Làm thế nào để có được chuỗi đầy đủ để in?

Trả lời

1

Thay đổi cài đặt php.ini log_errors_max_len có giúp không?

Ngoài ra, xin lưu ý rằng thông điệp được cắt ngắn chỉ trong thời gian đầu ra, bạn vẫn có thể nhận được thông báo lỗi ban đầu với cuộc gọi đến $ exception-> getMessage()

+3

Trước khi tạo bài đăng này, tôi đã chạm giá trị của log_errors_max_len từ 1024 đến 4096. Nhưng không có sự khác biệt. – User

+0

Về getMessage(), tôi sử dụng cả getMessage() và getTraceAsString() nhưng chúng in những thứ khác nhau nên tôi cần cả hai. – User

+0

Điều này không đủ cho đầu ra 'getTraceAsString()' đầy đủ –

27

Tôi tạo ra chức năng này để trả lại một vết đống không có chuỗi cắt ngắn:

function getExceptionTraceAsString($exception) { 
    $rtn = ""; 
    $count = 0; 
    foreach ($exception->getTrace() as $frame) { 
     $args = ""; 
     if (isset($frame['args'])) { 
      $args = array(); 
      foreach ($frame['args'] as $arg) { 
       if (is_string($arg)) { 
        $args[] = "'" . $arg . "'"; 
       } elseif (is_array($arg)) { 
        $args[] = "Array"; 
       } elseif (is_null($arg)) { 
        $args[] = 'NULL'; 
       } elseif (is_bool($arg)) { 
        $args[] = ($arg) ? "true" : "false"; 
       } elseif (is_object($arg)) { 
        $args[] = get_class($arg); 
       } elseif (is_resource($arg)) { 
        $args[] = get_resource_type($arg); 
       } else { 
        $args[] = $arg; 
       } 
      } 
      $args = join(", ", $args); 
     } 
     $rtn .= sprintf("#%s %s(%s): %s(%s)\n", 
           $count, 
           $frame['file'], 
           $frame['line'], 
           $frame['function'], 
           $args); 
     $count++; 
    } 
    return $rtn; 
} 

Ngoài ra, bạn có thể chỉnh sửa mã nguồn php, nơi nó được cắt bỏ đầu ra: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392

+0

Cảm ơn chức năng này. Rất hữu dụng. Việc cắt ngắn backtrace trong Exception đã làm tôi thất vọng nhiều năm nhưng tôi không bao giờ có thời gian để làm bất cứ điều gì về nó. Tôi đã thêm hàm của bạn vào lớp Ngoại lệ cốt lõi của tôi trên http://www.lampcms.com ngay bây giờ. – Dmitri

+5

liên kết đã lỗi thời, trớ trêu thay "Một ngoại lệ đã xảy ra" –

+0

Tôi đã cập nhật liên kết. – Steve

3

Giải pháp đó là tốt nhưng trong trường hợp của tôi nó đã ném một lỗi vì dấu vết của tôi có chức năng nội bộ trong đó. Tôi đã thêm một vài dòng mã để kiểm tra để các hàm theo dõi vẫn hoạt động.

function getExceptionTraceAsString($exception) { 
    $rtn = ""; 
    $count = 0; 
    foreach ($exception->getTrace() as $frame) { 


     $args = ""; 
     if (isset($frame['args'])) { 
      $args = array(); 
      foreach ($frame['args'] as $arg) { 
       if (is_string($arg)) { 
        $args[] = "'" . $arg . "'"; 
       } elseif (is_array($arg)) { 
        $args[] = "Array"; 
       } elseif (is_null($arg)) { 
        $args[] = 'NULL'; 
       } elseif (is_bool($arg)) { 
        $args[] = ($arg) ? "true" : "false"; 
       } elseif (is_object($arg)) { 
        $args[] = get_class($arg); 
       } elseif (is_resource($arg)) { 
        $args[] = get_resource_type($arg); 
       } else { 
        $args[] = $arg; 
       } 
      } 
      $args = join(", ", $args); 
     } 
     $current_file = "[internal function]"; 
     if(isset($frame['file'])) 
     { 
      $current_file = $frame['file']; 
     } 
     $current_line = ""; 
     if(isset($frame['line'])) 
     { 
      $current_line = $frame['line']; 
     } 
     $rtn .= sprintf("#%s %s(%s): %s(%s)\n", 
      $count, 
      $current_file, 
      $current_line, 
      $frame['function'], 
      $args); 
     $count++; 
    } 
    return $rtn; 
} 
1

Ngoài ra còn có các sắc jTraceEx thức bởi Ernest Vogelsinger tại http://php.net/manual/fr/exception.getmessage.php, có hỗ trợ xích ngoại lệ và được định dạng theo một cách Java như thế nào.

Dưới đây là một so sánh lấy trực tiếp từ bình luận của ông trên php.net:

Exception :: getTraceAsString:

#0 /var/htdocs/websites/sbdevel/public/index.php(70): seabird\test\C->exc() 
#1 /var/htdocs/websites/sbdevel/public/index.php(85): seabird\test\C->doexc() 
#2 /var/htdocs/websites/sbdevel/public/index.php(89): seabird\test\fail2() 
#3 /var/htdocs/websites/sbdevel/public/index.php(93): seabird\test\fail1() 
#4 {main} 

jTraceEx:

Exception: Thrown from class C 
at seabird.test.C.exc(index.php:78) 
at seabird.test.C.doexc(index.php:70) 
at seabird.test.fail2(index.php:85) 
at seabird.test.fail1(index.php:89) 
at (main)(index.php:93) 
Caused by: Exception: Thrown from class B 
at seabird.test.B.exc(index.php:64) 
at seabird.test.C.exc(index.php:75) 
... 4 more 
Caused by: Exception: Thrown from class A 
at seabird.test.A.exc(index.php:46) 
at seabird.test.B.exc(index.php:61) 
... 5 more 
-1

Nếu bạn có thể nhận được ngay với var_dump() một giải pháp dễ dàng là:

try { 
    ... 
} catch (Exception $e) 
    var_dump($e->getTrace()); 
} 

Bị đánh cắp từ số lớn này answer by Andre

+0

Điều này sẽ chỉ ouput một Array – Xiao

Các vấn đề liên quan