使用__LINE__ __FILE__etc的标准PHP错误函数?

时间:2010-07-21 02:38:07

标签: php error-handling

所以,而不是很多

的实例
if (odbc_exec($sql))
{
}
else
{
  myErrorHandlingFunction();
}

我将它包装在一个函数

function myOdbxExec($sql)
{
  if (odbc_exec($sql))
  {
  }
  else
  {
    myErrorHandlingFunction();
  }
}

但是我希望myErrorHandlingFunction()报告__LINE__ __FILE__等内容

看起来我必须将这些信息传递给每个辅助函数调用,例如myOdbxExec($sql, __FILE__, __LINE__)使我的代码看起来很混乱。

function myErrorHandlingFunction($errorTExt, $fiel, $line)
{
  // error reporting code goes here
}


function myOdbxExec($sql, $file, $line)
{
  if (odbc_exec($sql))
  {
  }
  else
  {
    myErrorHandlingFunction();
  }
}

$sql = 'select * from ... blah, blah, blah...';
myOdbxExec($sql, __FILE__, __LINE__);   // <==== this is *ugly*

在C中我会把它隐藏在#define后面,例如#define MY_OFBC_EXEC(sql) myOdbxExec(sql, __FILE__, __LINE__)

1)(怎么样)我可以用PHP做到这一点 2)还有什么值得淘汰的?例如error_get_last()?但是,如果odbc_exec()失败,这没有意义......

重新解释这个问题 - PHP错误处理的一般方法是什么? (特别是当set_error_handler()不适用时?


编辑:只是为了清楚 - 我确实想处理异常,编程错误等,但是,正如我的例子所示,我也想处理soemthings,PHP解释器可能不会认为是一个错误,如{{ 1}}返回false()。

3 个答案:

答案 0 :(得分:7)

以上提到debug_backtrace的答案都在用debug_backtrace()函数回答你的_______LINE_____ / _______FILE___问题。我过去也想要这个答案,所以我们总结了一个快速的功能来处理它。

function myErrorHandlingFunction($message, $type=E_USER_NOTICE) {
    $backtrace = debug_backtrace();
    foreach($backtrace as $entry) {
        if ($entry['function'] == __FUNCTION__) {
            trigger_error($entry['file'] . '#' . $entry['line'] . ' ' . $message, $type);
            return true;
        }
    }
    return false;
}

然后,您可以调用myErrorHandlingFunction('my error message');

myErrorHandlingFunction('my fatal error message', E_USER_ERROR);

try { ... } catch (Exception $e) { myErrorHandlingFunction($e->getMessage()); }

答案 1 :(得分:6)

首先,您可能需要考虑使用exception handling

如果出于某种原因,这对您没有吸引力,您可以在通用错误处理程序中使用debug_backtrace来确定调用处理程序的位置。

编辑回应OP的评论:

异常不一定来自PHP内置函数。你可以扔自己的。由于ODBC错误通常 是一种异常情况,因此当您检测到错误时,只有throw异常。 (并且catch它处于更高级别。)

<?PHP
if (! odbc_exec($sql) ) 
    throw new DatabaseException('odbc_exec returned false, that bastard!');

答案 2 :(得分:1)

使用debug_backtrace确定错误处理程序中函数的调用位置。无论是通过手动调用它来调用此错误处理程序,通过抛出和捕获异常,PHP error_handler或任何其他方法都取决于应用程序设计,并且与其他语言的区别并不大。