【发布时间】:2026-01-20 22:25:01
【问题描述】:
和其他许多人一样,我正在尝试创建自己的 MVC 来提高我的知识等:) 我想问一下如何处理 MVC 模式中的错误/异常。
Dispatcher 正在从 Router 获取有关 Route 的信息,并从 Route 获取 Controller 和方法的名称。然后调度程序正在尝试创建此Controller 的实例并执行此方法。
现在让我们假设我们的方法正在抛出异常(是的,由于代码错误,它没有被方法捕获:))。它可以是自定义异常,如 NotFoundException 或 ApplicationInternalErrorException 或 SPL 异常之一,如 RuntimeErrorException 或 InvalidArgumentException。没关系,真的。
当然,我们希望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