Как я могу получить полную строку PHP getTraceAsString ()? - PullRequest
20 голосов
/ 23 декабря 2009

Я использую getTraceAsString() для получения трассировки стека, но по какой-то причине строка усекается.

Пример: выдается исключение, и я записываю строку, используя:

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

Выводимая строка:

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

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

Ответы [ 7 ]

30 голосов
/ 20 мая 2011

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

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, где он обрезает вывод:

5 голосов
/ 06 декабря 2011

Некоторая лучшая версия https://stackoverflow.com/a/6076667/194508 здесь https://gist.github.com/1437966 добавлен класс для вывода.

4 голосов
/ 22 июля 2015

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

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;
}
2 голосов
/ 23 декабря 2009

Поможет ли изменить настройку php.ini log_errors_max_len?

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

1 голос
/ 05 января 2016

Существует также превосходный рецепт jTraceEx Эрнеста Фогельсингера на https://www.php.net/manual/exception.gettraceasstring.php#114980,, который поддерживает цепочечные исключения и отформатирован в стиле 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
0 голосов
/ 31 мая 2019

Вы можете распечатать обратную трассировку с

debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);

Не усекается.

Пример печати будет

#0  W3\\Sausage\\Mushroom->setCredentials() called at [/sausage/common/library/W3/Vzaar/Api.php:40]
#1  W3\\Sausage\\Mushroom->__construct() called at [/sausage/common/modules/video.mod.php:24]
#2  ModVideo->__construct() called at [/sausage/common/core/modules.core.php:133]
#3  Modules->__get() called at [/sausage/common/search/Classified/ESAdapter.php:399]
#4  Base\\Search\\Classified\\ESAdapter->getVideoInfo() called at [/sausage/common/search/Classified/ESAdapter.php:436]
#5  Base\\Search\\Classified\\ESAdapter->fillDataSet() called at [/sausage/common/search/Adapter.php:58]
0 голосов
/ 20 января 2017

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

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

Украденный из этого замечательного ответа Андре

...