所以,而不是很多
的实例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()。
答案 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
或任何其他方法都取决于应用程序设计,并且与其他语言的区别并不大。