2010-01-15 151 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"); 

欲了解更多关于各种类型的控制,请看看答案中其他地方发布的更明确的版本。