php - 在MVC中处理错误/异常

标签 php model-view-controller error-handling

和许多其他应用一样,我正在尝试创建自己的MVC来提高我的知识等。:)
我想问一下在MVC模式中处理错误/异常的问题。
DispatcherRouter获取有关Route的信息,并从Controller获取Route和方法的名称。然后,调度程序尝试创建此Controller的实例并执行此方法。

现在,让我们想象一下我们的方法抛出异常(是的,由于错误的代码,它没有被方法捕获):)。它可以是自定义的异常,例如NotFoundExceptionApplicationInternalErrorException或SPL异常(exception)之一,例如RuntimeErrorExceptionInvalidArgumentException。没关系,真的。

当然,我们希望Dispatcher捕获此异常,对其进行记录并相应地响应异常类型:如果捕获到NotFoundException,则显示404页面,等等。

最佳做法是什么? Dispatcher是执行此操作的正确位置吗?也许最好的地方是FrontController(但是我没有使用这种模式; Dispatcher正在创建Controller实例。

简单的代码:

class Dispatcher {

    public function dispatch() {

        $controller = $this->getRouter()->getController();
        $method     = $this->getRouter()->getMethod();
        $args       = $this->getRouter()->getArguments();

        try {
            call_user_func_array(array($controller, $method), array_values($args));                
        } catch (Exception $e) {
            Logger::log($e->__toString);
            if ($e instanceof NotFoundPage) {
                call_user_func(array('ErrorController', 'notFound'))
            } elseif ($e instanceof ...) {
               ...
            } elseif ($e instanceof ...) {
               ...
            } else {
               ...
            }
        }

    }
}

可以吗,还是不是很好的做法?

谢谢。

最佳答案

我只是使用一个外部文件(xml,yaml或任何您喜欢的文件),其中包含我的Web应用程序的所有路由。当请求到来时,路由器会尝试将请求url与文件中的路由之一进行匹配。如果没有匹配项,它将简单地使用404 header 重定向到404页面。我认为您不需要为此的try/catch块。

我从Symfony那里得到了这个想法。

关于php - 在MVC中处理错误/异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7085860/

相关文章:

PHP 警告 : Module 'imagick' already loaded in Unknown on line 0

php - 从 Laravel 的 Blade View 导出 Excel

php - 将多维 php 数组插入 mysqli 数据库

php - foreach 更新查询从数组中设置相同的最后一个值

model-view-controller - MVC : Am I doing it right?

c++ - 如何更新 QStringListModel?

java - 使用PHP、MySQL的Android登录注册系统出现错误 'java.lang.NoSuchMethodError: org.apache.http.impl.client.DefaultHttpClient.execute'

model-view-controller - 矢量图形编辑器的设计模式

ms-access - 错误时 GoTo 不工作;代码中断

swift - Swift 中除以 0 时捕获错误