2009-12-22 5 views
19

J'utilise getTraceAsString() pour obtenir une trace de pile mais la chaîne est tronquée pour une raison quelconque.Comment puis-je obtenir la chaîne complète de PHP getTraceAsString()?

exemple, une exception est levée et je me connecte la chaîne en utilisant:

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

La thats chaîne imprime est:

# 0 C: \ unrépertoire \ unrépertoire \ unrépertoire \ somedir \ SomeScript.php (10): SoapClient-> SoapClient ('http://www.ex ...')

Comment puis-je obtenir la chaîne complète pour imprimer?

Répondre

1

La modification du paramètre php.ini log_errors_max_len va-t-elle vous aider?

En outre, s'il vous plaît noter que les messages sont tronqués uniquement pendant la sortie, vous pouvez toujours obtenir le message d'erreur d'origine avec appel à exception- $> getMessage()

+3

Avant de créer ce poste je me suis cogné la valeur de log_errors_max_len de 1024 à 4096. Mais il n'y avait pas de différence. – User

+0

En ce qui concerne getMessage(), j'utilise à la fois getMessage() et getTraceAsString() mais ils impriment des choses différentes, donc j'ai besoin des deux. – User

+0

Cela ne suffit pas pour la sortie 'getTraceAsString()' complète –

27

J'ai créé cette fonction pour renvoyer une trace de la pile sans chaînes tronquées:

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

Sinon, vous pouvez modifier la source de php où il tronque la sortie: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392

+0

Merci pour cette fonction. Très utile. La troncature de Backtrace dans Exception m'embêtait depuis des années mais je n'ai jamais eu le temps de faire quoi que ce soit à ce sujet. J'ai ajouté votre fonction à ma classe d'Exception principale sur http://www.lampcms.com maintenant. – Dmitri

+5

lien obsolète, ironiquement "Une exception s'est produite" –

+0

J'ai mis à jour le lien. – Steve

3

Cette solution est bonne mais dans mon cas, elle a généré une erreur car ma trace a des fonctions internes. J'ai ajouté quelques lignes de code pour vérifier cela afin que les fonctions de trace fonctionne toujours.

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

Il y a aussi l'excellente recette jTraceEx par Ernest Vogelsinger à http://php.net/manual/fr/exception.getmessage.php, qui prennent en charge enchaînée exceptions et est formaté d'une manière de type Java.

Voici une comparaison tirée directement de son commentaire sur 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

Si vous pouvez vous en sortir avec var_dump() une solution facile est:

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

volés de ce grand answer by Andre

+0

Cela va juste sortir un tableau – Xiao

Questions connexes