2010-01-15 68 views
11

我有一個php應用程序,我剛重新考慮了因素。將警告視爲錯誤

警告::像不幸的是噴涌而出警告的preg_match()預計參數2是串,對象上的線776在

給出/home/yacoby/dev/netbeans/php/Zend/Db/Select.php

這是不可能的(或非常努力的工作)來解決這個問題,因爲我沒有一個調用堆棧,所以不能告訴我的代碼的哪個部分導致警告,並且有很多代碼。

我需要一種方法來處理警告,如錯誤(應用程序死亡和打印堆棧跟蹤),或者我需要在打印錯誤時顯示堆棧跟蹤。有沒有辦法做到這一點?

+2

Xdebug是我的選擇。 – andyk 2010-01-15 11:22:26

+0

XDebug的答案被接受了,因爲它產生了最好的stacktrace(加上它在我的IDE中有可點擊的鏈接;))。所有其他人都得到+1以及良好的答案,這一切都運行良好。 – Yacoby 2010-01-15 11:35:28

+1

XDebug在此討論此功能http://xdebug.org/docs/stack_trace – naivists 2010-01-15 11:21:32

回答

4

可以使用的set_error_han dler()

在處理函數,你可以把每個類的錯誤,但是你想定義自己的錯誤處理。這是我使用的基本模板,在我的情況下,我只想處理致命錯誤,所以我忽略了通知和警告。

在你的情況,你可以做警告回溯,或登錄他們,但是你想

function error_handler($errno,$message,$file,$line,$context) { 

switch($errno) { 
    // ignore warnings and notices 
    case E_WARNING: 
    case E_NOTICE: 
    case E_USER_NOTICE: 
    case E_USER_WARNING: 
     break; 
    // log PHP and user errors 
    case E_ERROR: 
    case E_USER_ERROR: 
       // Do some processing on fatal errors 
    } 
} 
+1

以下錯誤類型不能用用戶定義函數處理:** E_ERROR **,E_PARSE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING和在調用set_error_handler()的文件中引發的大部分E_STRICT。 - 但我仍然贊成。 – Gordon 2010-01-15 11:41:13

+0

啊,謝謝你的信息。我通常使用它來處理USER_ERROR,但不知道它無法捕捉到E_ERROR,雖然它在您思考時確實有意義。 – 2010-01-15 12:04:24

18

見例如#1 http://www.php.net/manual/en/class.errorexception.php

<?php 
function exception_error_handler($errno, $errstr, $errfile, $errline) { 
    throw new ErrorException($errstr, $errno, 0, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

/* Trigger exception */ 
strpos(); 
?> 
+0

這很酷,我從來沒有想過這樣做。 – 2010-01-15 11:34:47

+0

我認爲這是PHPUnit如何將常規錯誤,通知和警告轉化爲PHPUnit Framework錯誤/通知/警告異常。 – Gordon 2010-01-15 11:43:44

+0

不知道它是否「酷」,但它絕對是最簡單的。 :P – 2010-01-15 13:45:46

9

看一看set_error_handler(),包括這在您的腳本的開始或在您的引導程序中只在E_WARNING發生時打印堆棧跟蹤。

function stacktrace_error_handler($errno,$message,$file,$line,$context) 
{ 
    if($errno === E_WARNING) { 
     debug_print_backtrace(); 
    } 
    return false; // to execute the regular error handler 
} 
set_error_handler("stacktrace_error_handler"); 

欲瞭解更多關於各種類型的控制,請看看答案中其他地方發佈的更明確的版本。