我最近遇到一些代码,它们使用自定义错误处理程序将任何 PHP 错误转换为通用应用程序异常。还定义了一个自定义异常处理程序,如果异常在特定错误代码范围内,它将记录异常。例子:
class AppException extends Exception
{
}
function error_handler($errno, $errstr, $errfile, $errline)
{
throw new AppException($errstr, $errno);
}
function exception_handler($exception)
{
$min = ...;
$max = ...;
if ($exception->getCode() >= $min && $exception->getCode() <= $max)
{
// log exception
}
}
set_error_handler('error_handler');
set_exception_handler('exception_handler');
$a[1]; // throws exception
问题是我看到了这样的事情:
try
{
do_something();
}
catch (AppException $exception)
{
}
这意味着实际的编程错误和“异常”行为之间没有区别。经过进一步挖掘,我发现了部分代码是围绕 PHP 错误代表“异常”行为的想法设计的,例如:
...
function my_function($param1, $param2)
{
// do something great
}
try
{
my_function('only_one_param');
}
catch (AppException $exception)
{
}
这最终会混淆错误和应用程序界面的设计。
您对以这种方式处理错误有何看法?是否值得将 PHP 的本机错误转为异常?在上述情况下,如果代码库是围绕这个想法设计的,您会怎么做?
就我个人而言,我一直这样做。唯一的区别是在我的error_handler
函数,我检查错误是否是E_NOTICE
首先,只有在不是的情况下才会抛出(无论如何我都会记录通知)......
我会改变AppException
延伸到某事物ErrorException
... 就像是:PhpRuntimeErrorException extends ErrorException
仅用于 PHP 错误...原因是这样它更具可读性(更容易分辨什么是PhpRuntimeErrorException
不需要弄清楚它被扔到哪里)。另一个原因是,ErrorException
将存储生成的行/文件/等信息,它不会存储在其他地方(因为回溯从throw
线)...
因此,您可以“尝试”这样的代码:
try {
$f = fopen('foo.bar', 'r');
$ret = '';
while ($data = fread($f)) {
$ret .= process($data);
}
fclose($f);
return '';
} catch (PHPRuntimeErrorException $e) {
throw new RuntimeException('Could not open file');
} catch (ProcessException $e) {
fclose($f);
throw new RuntimeException('Could not process data');
}
return $ret;
我还让我的默认异常处理程序生成 500 服务器错误页面。那是因为任何异常都应该被捕获,如果没有,那确实是服务器错误......
只是我的经验和看法...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)