0

我正在尝试开发一个用于学习目的的个人 MVC 框架。但每次我都陷入这个问题:错误。

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

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

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

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

4

2 回答 2

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冒泡,但通常这是一个不好的做法。异常应该是同一抽象级别的句柄,它被抛出的地方,或者,在严重异常的情况下(当对象本身无法处理它时),异常可能会穿透一个抽象边界。异常不应该离开模型层,而是应该在层中创建错误状态,并在您当前的视图实例中进行处理。

重点是:您应该在错误发生的地方附近处理错误,而不是所有错误的神奇处理程序。

于 2012-06-16T14:34:00.953 回答
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);
}
于 2012-06-16T13:33:05.250 回答