gpt4 book ai didi

php - 将错误转换为异常 : design flaw?

转载 作者:可可西里 更新时间:2023-10-31 22:41:26 24 4
gpt4 key购买 nike

我最近发现一些代码使用自定义错误处理程序将任何 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 的 native 错误转换为异常?在上述情况下,代码库是围绕这个想法设计的,你会怎么做?

最佳答案

就个人而言,我一直这样做。唯一的区别是,在我的 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 服务器错误页面。那是因为应该捕获任何异常,如果没有捕获,那确实是服务器错误...

只是我的经验和意见...

关于php - 将错误转换为异常 : design flaw?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3425835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com