【问题标题】:How to catch exceptions in your ZF2 controllers?如何在 ZF2 控制器中捕获异常?
【发布时间】:2012-10-28 11:39:13
【问题描述】:

我已经用ZF 2.0.3 设置了ZendSkeletonApplication,但我无法在我的控制器中捕获异常。例如,如果我将以下代码放入module/Application/src/Application/Controller/IndexController.php:

public function indexAction() {
    echo "BEFORE\n";
    try {
        throw new \Exception("My exception");
    } catch (Exception $e) {
        echo "Caught exception $e\n";
        exit;
    }

并访问我得到的页面:

BEFORE
An error occurred
An error occurred during execution; please try again later.
Additional information:
Exception

File:

    module/Application/src/Application/Controller/IndexController.php:25

Message:

    My exception

ViewModel 启动并显示异常,有效地阻止我捕获它。

如何在ZF2 控制器中捕获异常?

【问题讨论】:

  • 是全局命名空间中的控制器吗?否则,您必须使用 \Exception 或捕获 \Exception
  • 只是对您正在使用的异常处理方式的评论。我不愿意捕捉异常,因为那太笼统了。你基本上说的是“我打算处理这里可能发生的每一个可能的异常”。如果您的代码调用了其他可能引发异常的方法,而该代码又可能调用引发异常的代码,那么追踪原始错误的来源可能会变得非常困难。我建议对你所期望的每一种异常都使用一个 catch 块,而让其他一切都没有被捕获。

标签: php exception try-catch zend-framework2


【解决方案1】:

你正在抛出 PHP 的通用异常

throw new \Exception("My exception");

但是你从当前命名空间中捕获了异常

} catch (Exception $e) {

假设你的控制器在Application\Controller,你要么必须声明

use \Exception;

把你的类上面的import the global Exception放到当前的命名空间中或者

} catch (\Exception $e) {

捕捉 PHP 的全局异常。

【讨论】:

  • 附带问题:catch (\Exception $e) { 是否会捕获所有可能发生的异常,或者只是那些扩展 Exception 类的异常(例如,它会捕获 class ORMException extends Exception 吗?)如果没有,有没有办法捕获任何异常(是否值得尝试这样做,因为我假设可能已编码的库应该扩展 Exception 以进行自定义异常处理,还是我弄错了?)
  • 查看 GordonMs 的评论
  • @user 因为所有的异常都扩展了 PHP 的全局异常,catch \Exception 将捕获任何异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多