我们将zend框架2用于web应用程序。
我们似乎在生产环境中禁用了error_reporting和display_errors。
但是,如果发生SQL错误(它不应该在生产中,但…:-)),则仍然显示异常:
PDOException
File:
[...]/vendor/doctrine/dbal/lib/Doctrine/DBAL/Statement.php:165
Message:
SQLSTATE[42000]: Syntax error or access violation
查询使用Doctrine\DBAL\语句(Doctrine2)。
我们找不到全局捕获此异常的位置。
确保您有正确的view_manager
配置设置。
// config/autoload/global.php
return array(
'view_manager' => array(
'display_not_found_reason' => false,
'display_exceptions' => false,
),
);
请记住,此配置是合并的;如果它在主global.php
中,它将优先于module.config.php
。
它的工作原理
每次ZF2遇到错误(异常)时,它总是捕获错误。不是在屏幕上"重新思考"异常信息,而是将信息添加到MVC事件中,并触发"错误"事件(dispatch.error
或render.error
,取决于它在调度循环中的位置)。
ZendMvcViewHttpViewManager
附加"错误侦听器"来处理这些事件(通常用于显示错误模板)。如果使用的是标准骨架应用程序,则默认错误模板将选中display_exceptions
选项,并且仅在启用该选项时才呈现错误。
内部:Zend\Db\Adapter\Driver\Pdo\Connection
搜索线路:
$this->resource = new PDO($dsn, $username, $password, $options);
$this->resource->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
并将其更改为:
$this->resource = new PDO($dsn, $username, $password, $options);
$this->resource->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
我不知道是否有一种方法可以在不更改库本身的情况下全局覆盖它。。
这就是我的做法,在index.php 中
try {
include ROOT . '/init_autoloader.php';
ZendMvcApplication::init(include 'config/application.config.php')->run();
} catch (Exception $e) {
if (IS_DEVELOPMENT_SERVER)
throw $e;
else {
echo('Error : ' . $e->getCode() . " " . $e->getMessage());
}
}