new php string exception truncation truncated

new - ¿Cómo puedo obtener la cadena completa de getTraceAsString() de PHP?



php message exception (6)

Estoy usando getTraceAsString() para obtener un seguimiento de pila, pero la cadena se está truncando por algún motivo.

Ejemplo, se lanza una excepción y registro la cadena usando:

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

La cadena que se imprime es:

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

¿Cómo puedo obtener la cadena completa para imprimir?


¿Cambiar la configuración de php.ini log_errors_max_len ayudará?

Además, tenga en cuenta que los mensajes solo se truncan durante la salida, aún puede recibir el mensaje de error original con la llamada a $ exception-> getMessage ()



Creé esta función para devolver un seguimiento de pila sin cadenas truncadas:

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

Alternativamente, puede editar la fuente php donde está truncando la salida: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392


Esa solución es buena, pero en mi caso arrojó un error porque mi rastreo tiene funciones internas. Agregué algunas líneas de código para verificar que las funciones de rastreo aún funcionan.

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


Si puede salirse con var_dump() una solución fácil es:

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

Robado de esta gran respuesta por Andre


También está la excelente receta jTraceEx de Ernest Vogelsinger en http://php.net/manual/fr/exception.getmessage.php , que admite excepciones encadenadas y está formateada de forma similar a Java.

Aquí hay una comparación tomada directamente de su comentario en php.net:

Excepción :: 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