php - 显示 PHP 源代码哪里发生错误?

标签 php error-handling

我曾经看到一些 PHP 的框架或代码有一个错误处理程序(类或函数),它会显示错误消息、发生错误的行号以及实际的源代码(如果有某种类型)如果代码中出现错误,它将显示实际 PHP 文件中导致错误的行或几行。这真的很酷,我知道你不会想在实时生产服务器/站点上执行此操作,但对于调试来说,它非常好,是我以前从未见过的。

我不记得我在哪里看到这个或它是如何完成的。如果您对如何做类似的事情有任何想法,我希望有一个很好的错误处理小类可以做类似的事情,如果可以的话,请分享任何代码、想法等,非常感谢任何帮助,谢谢!

最佳答案

你所说的是stack trace ,在 PHP 中您可以使用 debug_backtrace() 检索它.
大多数框架都有自己的显示堆栈跟踪的方式,但基本上他们都使用这样的功能。

但是,您真正要寻找的是 Xdebug它是 PHP 的调试器和 profilter,可以让您逐步运行代码。

<小时/>

编辑:

如果你想处理错误以提供你自己的工作方式,你必须使用 set_error_handler()set_exception_handler()

一个简单的例子:

<?php
    function myErrorHandler($errno, $errstr, $errfile, $errline) {
      echo "[$errno] $errstr" . PHP_EOL;
      echo "On line $errline in file $errfile" . PHP_EOL;

      $range = array(
          $errline - 5,
          $errline + 5,
       );

       $source = explode(PHP_EOL, file_get_contents($errfile));
       for ($i = $range[0]; $i <= $range[1]; ++$i) {
           if ($i === count($source)) break;
           if ($i === $errline-1) {
               printf("%d | %s  <<<<< Here is the error\n", $i, $source[$i]);
           } else {
               printf("%d | %s \n", $i, $source[$i]);
           }
       }
    }

    set_error_handler('myErrorHandler');

    error_reporting(E_ALL);

    $a = 'Setting variable $a';

    $obj = new Stdclass();
    $obj->foo = 'bar';

    // Oops I'm calling an undefined variable
    echo $undefinedVariable;

    $numbers = array(1,2,3,4,5);
    for($i = 0; $i < 5; ++$i) {
        $numbers[$i] = $i - 1;
    }  

在 cli 上尝试这个,应该会告诉你:

bguery@joyless:sandbox $ php debugbacktrace.php 
[8] Undefined variable: undefinedVariable
On line 33 in file debugbacktrace.php
28 | $obj = new Stdclass(); 
29 | $obj->foo = 'bar'; 
30 |  
31 | // Oops I'm calling an undefined variable 
32 | echo $undefinedVariable;  <<<<< Here is the error
33 |  
34 | $numbers = array(1,2,3,4,5); 
35 | for($i = 0; $i < 5; ++$i) { 
36 |     $numbers[$i] = $i - 1; 
37 | }   
38 |  

请注意,这是一个非常基本的用法,但它确实有效。如果您打算处理 E_ERRORE_PARSE 等,您可能需要做更多工作,并且可能需要使用 register_shutdown_function()

关于php - 显示 PHP 源代码哪里发生错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331449/

相关文章:

PHP 从子类中获取覆盖的方法

PHP代码在正斜杠前添加反斜杠

java - 为什么类中的公共(public)枚举类型不能在单独的主类中初始化?

php - 使用 PHP 将图像上传到 FTP

php - DELETE FROM 不起作用(mysql)

excel - Selection.EntireRow.Delete 错误,可以在行的多列中选择单元格?

python - 获取递归错误: maximum recursion depth exceeded in comparison

string - Swift 非可选值函数中的错误处理

php - 无法从sql数据库获取结果

go - 在 Go 中,定义明确的类型的 JSON 编码(marshal)处理会失败吗?