2009-12-22 11 views
19

Sto utilizzando getTraceAsString() per ottenere una traccia stack ma la stringa viene troncata per qualche motivo.Come posso ottenere la stringa completa di getTraceAsString() di PHP?

Esempio, viene generata un'eccezione e mi registrare la stringa utilizzando:

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

thats stringa viene stampato è:

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

Come posso ottenere la stringa completa per la stampa?

risposta

1

Cambiare l'impostazione php.ini log_errors_max_len aiuto?

Inoltre, si prega di notare che i messaggi vengono troncati solo durante l'uscita, è ancora possibile ottenere il messaggio di errore originale con chiamata a $ eccezione-> getMessage()

+3

Prima di creare questo post ho urtato il valore di log_errors_max_len da 1024 a 4096. Ma non c'era alcuna differenza. – User

+0

Per quanto riguarda getMessage(), utilizzo sia getMessage() che getTraceAsString() ma stampano cose diverse, quindi ho bisogno di entrambi. – User

+0

Questo non è sufficiente per l'output 'getTraceAsString()' completo. –

27

Ho creato questa funzione per restituire una traccia dello stack senza stringhe troncate:

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

In alternativa, si potrebbe modificare il sorgente PHP in cui è troncando l'output: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392

+0

Grazie per questa funzione. Molto utile. Il troncamento del backtrace in Exception mi dava fastidio per anni ma non ho mai avuto il tempo di fare qualcosa al riguardo. Ho aggiunto la tua funzione alla mia classe Exception principale su http://www.lampcms.com ora. – Dmitri

+5

link obsoleto, ironicamente "Si è verificata un'eccezione" –

+0

Ho aggiornato il collegamento. – Steve

3

Questa soluzione è buona, ma nel mio caso ha generato un errore perché la traccia contiene funzioni interne. Ho aggiunto alcune righe di codice per verificarlo, quindi le funzioni di tracciamento funzionano ancora.

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

C'è anche l'eccellente jTraceEx ricetta da Ernest Vogelsinger a http://php.net/manual/fr/exception.getmessage.php, che supportano incatenato eccezioni ed è formattato in un modo simile a Java.

Ecco un confronto presa direttamente dal suo commento su php.net:

Eccezione :: 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

Se si riesce a farla franca con var_dump() una soluzione facile è:

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

rubato da questa grande answer by Andre

+0

Questo farà uscire una matrice – Xiao

Problemi correlati