Я использую getTraceAsString()
для получения трассировки стека, но по какой-то причине строка усекается.
Например, генерируется исключение, и я записываю строку, используя:
catch (SoapFault $e) { error_log( $e->getTraceAsString() ) }
Строка, которая печатает:
# 0 C: \ Somedirectory \ Somedirectory \ Somedirectory \ Somedir \ SomeScript.php (10): SoapClient-> SoapClient (' http: //www.ex …')
Как я могу получить полную строку для печати?
Я создал эту функцию для возврата трассировки стека без усеченных строк:
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
Некоторая лучшая версия https://stackoverflow.com/a/6076667/194508 здесь https://gist.github.com/1437966 добавила класс для вывода.
Это решение хорошо, но в моем случае оно породило ошибку, потому что в моем следе есть внутренние функции. Я добавил несколько строк кода, чтобы проверить это, чтобы функции трассировки все еще работали.
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; }
Будет ли изменяться настройка php.ini log_errors_max_len
?
Также обратите внимание, что сообщения усекаются только во время вывода, вы все равно можете получить исходное сообщение об ошибке с вызовом $ exception-> getMessage ()
Существует также отличный рецепт jTraceEx
Эрнеста Фогельсингера по адресу http://php.net/manual/fr/exception.getmessage.php , который поддерживает связанные исключения и отформатирован в стиле Java.
Вот сравнение, взятое непосредственно из его комментария на php.net:
Исключение :: 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
Если вы можете уйти с var_dump()
, простым решением будет:
try { ... } catch (Exception $e) var_dump($e->getTrace()); }
Украден из этого великого ответа Андре