2012-04-19 128 views
0

我試圖找到更好的PHP錯誤處理程序,其中一個將更容易在html中閱讀,但我沒有看到任何谷歌。自定義PHP錯誤處理程序

我試圖做出自己的想法,但搞清楚命令的任務比我花費的時間多,而且遇到了很多錯誤。

這裏是在PHP現在是正確的生產垃圾(文件,類和函數名稱已更改):

Fatal error: Cannot redeclare bbb() (previously declared in /home/user/path/1.php:5) in /home/user/path/1.php on line 26 Call Stack: 0.0309 662280 1. {main}() /home/user/path/1.php:0 0.0610 5610272 2. su::aaa() /home/user/path/1.php:21 0.0610 5610752 3. su::__callStatic() /home/user/path/class.su.php:0 0.0610 5611456 4. call_user_func_array() /home/user/path/class.su.php:27 0.0610 5611912 5. user->aaa() /home/user/path/class.su.php:0 0.0628 5670816 6. user->aaa() /home/user/path/class.user.php:3342 0.0628 5671640 7. user->aaa() /home/user/path/class.user.php:3407 0.0628 5672464 8. user->sss() /home/user/path/class.user.php:3449 0.0628 5679576 9. DA->ccc() /home/user/path/class.user.php:3475 

它是一點整行,我不能在我的腦海解析它很好地看看實際發生了什麼。我希望這個調用堆棧可以打印成漂亮的html。

感謝, 利亞

+0

php和錯誤處理是一個有趣的故事,只是結局更像是一個犯罪故事:php的許多部分仍然不會拋出異常或至少是可捕獲的東西,但終止執行。 – Hajo 2012-04-19 22:20:10

+0

只需按CTRL + U(不知道蘋果),你會發現回溯的格式實際上是多行的。此外,如果這是一個測試系統(因爲您需要在瀏覽器中查看錯誤並且未記錄),請考慮xdebug,它可以爲您提供更多風格的HTML回溯和錯誤,甚至包括錯誤。血管變異等。 http://xdebug.org/ < - 去獲取它的小工具。 – hakre 2012-04-19 22:33:01

回答

0

的功能,我正在尋找的是debug_backtrace。通過在錯誤處理程序中實現此功能,我可以打印調用堆棧。

1

使用set_error_handler()它是專爲設計的。定義接受以下參數的函數:

handler_function (int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]]) 

而且具有set_error_handler()到,而不是使用默認的PHP處理程序。請務必首先閱讀整個manual entry

0

有一個乾淨的實現你想要http://il.php.net/manual/en/function.set-error-handler.php什麼,並可以很容易地定製

守則

function myErrorHandler($errno, $errstr, $errfile, $errline) { 
    if (! (error_reporting() & $errno)) { 
     // This error code is not included in error_reporting 
     return; 
    } 

    switch ($errno) { 
     case E_USER_ERROR : 
      echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; 
      echo " Fatal error on line $errline in file $errfile"; 
      echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; 
      echo "Aborting...<br />\n"; 
      exit (1); 
      break; 

     case E_USER_WARNING : 
      echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
      break; 

     case E_USER_NOTICE : 
      echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; 
      break; 

     default : 
      echo "Unknown error type: [$errno] $errstr<br />\n"; 
      break; 
    } 

    /* Don't execute PHP internal error handler */ 
    return true; 
} 

如果這不是你想要什麼,然後更好地解釋