【问题标题】:Handling errors/exceptions in MVC处理 MVC 中的错误/异常
【发布时间】:2026-01-20 22:25:01
【问题描述】:

和其他许多人一样,我正在尝试创建自己的 MVC 来提高我的知识等:) 我想问一下如何处理 MVC 模式中的错误/异常。

Dispatcher 正在从 Router 获取有关 Route 的信息,并从 Route 获取 Controller 和方法的名称。然后调度程序正在尝试创建此Controller 的实例并执行此方法。

现在让我们假设我们的方法正在抛出异常(是的,由于代码错误,它没有被方法捕获:))。它可以是自定义异常,如 NotFoundExceptionApplicationInternalErrorException 或 SPL 异常之一,如 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 {
               ...
            }
        }

    }
}

可以吗,或者这不是一个很好的做法?

谢谢。

【问题讨论】:

  • 如果该方法不存在,它如何知道抛出该异常?你打算在你的所有控制器中使用 __call 来抛出异常吗?
  • 似乎您可能只想在尝试运行控制器和操作之前检查它们是否存在,如果不存在则重定向到 404。另外,getController() 是否返回该类的实际实例?
  • 您可以在 MVC 中捕获所有路由并将其指向您的 404 页面。看看这个类似的帖子:*.com/questions/1766321/…

标签: php model-view-controller error-handling


【解决方案1】:

我只是在使用一个外部文件(xml、yaml 或任何你喜欢的东西),其中包含我的 Web 应用程序的所有路由。当请求到来时,路由器会尝试将请求 url 与我文件中的一条路由匹配。如果没有匹配,它只是重定向到带有 404 标头的 404 页面。我认为你不需要 try/catch 块。

我的想法来自 Symfony。

【讨论】:

    最近更新 更多