Maw*_*awg 4 php error-handling
所以,而不是很多实例
if (odbc_exec($sql))
{
}
else
{
  myErrorHandlingFunction();
}
Run Code Online (Sandbox Code Playgroud)
我把它包装在一个函数中
function myOdbxExec($sql)
{
  if (odbc_exec($sql))
  {
  }
  else
  {
    myErrorHandlingFunction();
  }
}
Run Code Online (Sandbox Code Playgroud)
但我想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*
Run Code Online (Sandbox Code Playgroud)
在CI中,它会隐藏在#define后面,例如 #define MY_OFBC_EXEC(sql) myOdbxExec(sql, __FILE__, __LINE__)
1)(如何)我可以在PHP中做到这一点2)还有什么值得outoputting?例如error_get_last()?但如果odbc_exec()失败,这没有意义......
重新解释一下这个问题 -  PHP错误处理的一般方法是什么?(特别是什么时候set_error_handler()不适用?
编辑:只是为了清楚 - 我确实想处理异常,编程错误等,但是,正如我的例子所示,我也想处理soemthings,PHP解释器可能不会认为是一个错误,比如odbc_exec()返回false().
提到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;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以打电话, myErrorHandlingFunction('my error message');
要么 myErrorHandlingFunction('my fatal error message', E_USER_ERROR);
要么 try { ... } catch (Exception $e) { myErrorHandlingFunction($e->getMessage()); }
首先,您可能需要考虑使用异常处理.
如果由于某种原因,这对您没有吸引力,您可以在通用错误处理程序中使用debug_backtrace来确定调用处理程序的位置.
编辑回应OP的评论:
例外不必来自PHP内置函数.你可以扔自己的.由于ODBC错误通常是一种异常情况,因此只有throw在检测到错误时才会出现异常.(catch它在更高的层次上).
<?PHP
if (! odbc_exec($sql) ) 
    throw new DatabaseException('odbc_exec returned false, that bastard!');
Run Code Online (Sandbox Code Playgroud)