2009-12-22 10 views
19

Я использую getTraceAsString(), чтобы получить трассировку стека, но по какой-то причине строка усекается.Как я могу получить полную строку getTraceAsString() PHP?

Например, исключение, и я войти строку с помощью:

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

Строка Thats печатает это:

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

Как я могу получить полную строку для печати?

ответ

1

Изменится ли настройка php.ini log_errors_max_len help?

Кроме того, обратите внимание, что сообщения усечены только при выводе, вы все равно можете получить исходное сообщение об ошибке с вызовом $ exception-> GetMessage()

+3

Перед созданием этого сообщения я столкнулся с значением log_errors_max_len с 1024 до 4096. Но не было никакой разницы. – User

+0

Что касается getMessage(), я использую как getMessage(), так и getTraceAsString(), но они печатают разные вещи, поэтому мне нужны они оба. – User

+0

Этого недостаточно для полного 'getTraceAsString()' output –

27

Я создал эту функцию, чтобы вернуть трассировки стеки с не усеченные строки:

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; 
} 

в качестве альтернативы, вы можете редактировать исходный код PHP, где он усечения выход: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392

+0

Спасибо за эту функцию. Очень полезно. Усечение backtrace в Exception меня тянуло годами, но у меня не было времени что-либо сделать. Я добавил свою функцию в свой основной класс Exception на http://www.lampcms.com. – Dmitri

+5

устаревшая ссылка, по иронии судьбы «Исключено» –

+0

Я обновил ссылку. – Steve

3

Это решение хорошее, но в моем случае оно породило ошибку, потому что в моем следе есть внутренние функции. Я добавил несколько строк кода, чтобы проверить это, чтобы функции трассировки все еще работали.

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

Существует также отличный jTraceEx рецепт Эрнест Vogelsinger на http://php.net/manual/fr/exception.getmessage.php, которые поддерживают прикованы исключение и отформатирован в Java-подобным образом.

Вот сравнение берется непосредственно из его комментария на 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

Если вы можете уйти с var_dump() простым решением является:

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

Украденные из этого отличного answer by Andre

+0

Это просто выйдет из массива – Xiao

 Смежные вопросы

  • Нет связанных вопросов^_^