管理框架的错误

时间:2012-06-16 13:24:57

标签: php exception-handling error-handling

我正在尝试为学习目的开发个人MVC框架。但每次我遇到这个问题:错误。

我觉得我处理得非常糟糕。目前我有一个异常系统(一切都转换为异常,甚至是PHP触发的错误),它是try {}块中的catch,它包含框架和用户应用程序的每一行代码。

我正在处理诸如“找不到控制器”或“未找到操作”之类的错误,例如“无法连接到数据库”。但我觉得后者在某种程度上更像是一个“例外”,而不是一个非常常见的“未找到控制器(404)”。

目前我正在使用一个错误处理,它几乎复制了MVC在我的框架中的工作方式,从某种意义上说,当发生错误时,我加载一个特定的操作并为每种类型的错误加载一个特定的视图文件。我没有使用我的框架的MVC(通过MVC我是指加载控制器,运行动作,加载模型和用户应用程序的视图的所有机制),因为MVC中的错误可能导致错误被触发,尝试用MVC来管理它,这会再次触发相同的错误,然后再次加载MVC等等。

我应该如何处理框架的每个错误?现在最好的做法是什么?

2 个答案:

答案 0 :(得分:2)

执行控制器恕我直言可以产生两个例外:

  • 未找到:何时缺少控制器或方法
  • 权限被拒绝:ACL阻止访问

要处理这个问题,我会选择以下代码。你可以使用多个catch块。

try
{
    $controller->$command($request, $response);
}
catch(AccessDeniedException $e)
{
    $controller = new ErrorController;
    $controller->accessDenied($request, $response);
}
catch(NotFoundException $e)
{
    $controller = new ErrorController;
    $controller->notFound($request, $response);
}

您也可以让AccessDeniedException模型层冒出来,但通常这是一种不好的做法。异常应该是在相同抽象级别内的句柄,在它被抛出的地方,或者在关键异常的情况下(当对象本身无法处理它时),异常可能会穿透一个抽象边界。异常不应该离开Model Layer,而应该在图层中创建错误状态,并在当前的 View 实例中进行处理。

重点在于:对于所有错误,您应该处理接近其原始位置的错误,而不是魔法处理程序

答案 1 :(得分:0)

你可以在try catch上做一些更恰当的消息。例如:

try
{
    //Your code here
}
catch (Exception $e)
{
    // Clean the output buffer if one exists
    ob_get_level() and ob_clean();

    // Display the exception text
    echo sprintf('%s [ %s ]: %s ~ %s [ %d ]', get_class($e), $e->getCode(), strip_tags($e->getMessage()), $e->getFile(), $e->getLine())."\n";

    // Exit with an error status
    exit(1);
}