Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 管理框架的错误_Php_Exception Handling_Error Handling - Fatal编程技术网

Php 管理框架的错误

Php 管理框架的错误,php,exception-handling,error-handling,Php,Exception Handling,Error Handling,我试图开发一个个人MVC框架,用于学习目的。但每次我陷入这个问题:错误 我觉得我处理得很糟糕。目前,我有一个异常系统(所有内容都转换为异常,甚至PHP触发的错误),它被捕获在一个try{}块中,该块包含框架和用户应用程序的每一行代码 我像处理其他错误一样处理诸如“未找到控制器”或“未找到操作”之类的错误,例如“无法连接到数据库”。但我觉得后者更像是一个“例外”,而不是一个非常常见的“控制器未找到(404)” 此外,目前我正在使用一种错误处理方法,它几乎复制了MVC在我的框架中的工作方式,也就是说

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

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

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

此外,目前我正在使用一种错误处理方法,它几乎复制了MVC在我的框架中的工作方式,也就是说,当出现错误时,我会为每种类型的错误加载一个特定的操作并加载一个特定的视图文件。我没有使用我的框架的MVC(MVC指的是加载控制器、运行操作、加载模型和用户应用程序视图的所有机制),因为MVC中的错误可能会触发错误,它将尝试使用MVC管理它,MVC将再次触发相同的错误,然后在无限循环中再次加载MVC,以此类推


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

您可以在“尝试捕捉”时发出更合适的信息。例如:

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);
}

控制器IMHO的执行会产生两个异常:

  • 找不到:当缺少控制器或方法时
  • 权限被拒绝:当阻止访问时
要处理这个问题,我只需要使用下面的代码。您可以使用多个捕捉块

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


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

向用户显示友好的错误消息并记录异常不是更好吗?在IMO中,用户不应看到在大多数情况下对其没有任何意义的技术消息。对于用户,您可以在其中插入if,并显示如下消息:“出现问题,请稍后再试。系统管理员已通知此错误,并将很快修复。如果您仍然看到此消息,您可以通过问题编号432918702394870123984701联系此错误。您可以将其存储到日志文件、数据库,甚至发送电子邮件给您。你可以用任何你想用的方法来处理,但没有一个标准的方法来处理。你可能会发现这是一篇非常有用的帖子:多个
catch
块工作得很好,你怎么会认为它们不工作?见@Alan,tnx。。快速搜索给我的印象是,这是不可能的。可能发生的每个异常的代码总是相同的:呈现一个显示错误的HTML div并停止执行。@Jeffrey,所以基本上你说的是:tl;dr@tereško,我不明白你第一次说的话。好的,您找到的“未找到”和“拒绝访问”错误的解决方案是正确的。如果
ErrorController
中发生错误怎么办?