PHP在异常堆栈跟踪中切断了部分长参数。怎么告诉它不要?

时间:2017-04-27 18:46:09

标签: php error-handling

以下是来自PHP 7运行时的错误消息示例:

  

PHP致命错误:未捕获错误:类   在predis.php中找不到'Predis \ Connection \ ConnectionException':4168

     

堆栈追踪:

     

#0 /var/www/api/libraries/predis/predis.php(4455):   Predis \ Connection \ AbstractConnection-> onConnectionError('错误时   rea ...')

注意标记为#0的第一个堆栈跟踪线的省略号:

  

('错误,而rea ......')

如果没有被切断,这就是最重要的信息。其他错误消息具有相同的问题,通常会切断消息中非常有价值的部分。

是否有可用于在堆栈跟踪中打印更多信息的设置?我们使用的PHP的确切版本是7.1.1。

更新 How to disable PHP cutting off parts of long arguments in exception stack trace?中描述了我们遇到的确切问题。这个问题可以是一个骗局。想法是捕获异常,调用Exception :: getTrace()并手动构造错误消息。可以在全局处理程序或每个try / catch块中捕获异常。 Exception :: getTraceAsString的默认实现会截断长函数参数。

4 个答案:

答案 0 :(得分:1)

如果您在try { ... } catch (Exception $e) { ... }块中包装可能失败的调用,则可以根据需要显示尽可能多的异常错误消息。

您还可以控制代码对错误所做的操作,或者有助于在将来更好地避免此问题。

答案 1 :(得分:0)

为异常消息生成的错误输出由安装的调试器处理。 PHP附带的默认设置并不具备信息,您无法自定义该输出。

您可以附加自己的错误处理程序并打印自己的堆栈跟踪,也可以更改PHP中安装的调试程序。

如果安装xDebug或Zend调试器,则会在堆栈跟踪中获得更多信息。

https://xdebug.org/docs/stack_trace

enter image description here

答案 2 :(得分:0)

您可以使用getTraceAsString();

<?php
   function test() {
     throw new Exception;
   }

  try {
       test();
  } catch(Exception $e) {
       echo $e->getTraceAsString();
  }
 ?>

答案 3 :(得分:-1)

我认为你需要意识到你在这里有多层。这是实际错误

  

PHP致命错误:未捕获错误:在predis.php中找不到类'Predis \ Connection \ ConnectionException':4168

请注意,它未被捕获Error。您的代码可能不支持PHP 7.0+捕获错误的方法。因此,PHP出错了。至于你为什么要截断

  

#0 /var/www/api/libraries/predis/predis.php(4455):Predis \ Connection \ AbstractConnection-&gt; onConnectionError('rea while rea ...')

这里有两个问题

  1. Error while rea...是截断的参数
  2. Predis\Connection\AbstractConnection->onConnectionError这看起来像一个错误捕获机制。我怀疑这不是你的根本问题,只是症状
  3. 那么,我们可以解决这个问题吗?是的!

    无论你做什么都需要包裹在Throwable block中。 Throwable会捕获任何可以引发的内容,包括您的Error

    try { 
        \Your\Code\Here('Hi mom!');
    } catch(\Throwable $err) {
        echo $err->getMessage();
    }