2014-08-29 18 views
1

我們對一個web應用程序使用zend框架2。如何在生產環境中隱藏與zend框架2的PDOException?

我們在生產環境中禁用了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)。

我們無法找到全球發生此異常的位置。

+0

你有沒有在你的'config/autoload/global.php'中將'view_manager'配置鍵'display_exceptions'設置爲'false'? – AlexP 2014-08-29 12:36:15

+1

我已搜索display_exceptions配置。鍵入所有模塊,並找到一個保存真實值的文件。 謝謝AlexP,它的工作原理! :) – Jodaille 2014-08-29 14:03:01

+1

AlexP能否請您將您的評論轉換爲答案,以便我可以接受它? – Jodaille 2014-09-02 14:36:24

回答

1

確保您擁有正確的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.errorrender.error)。

Zend\Mvc\View\Http\ViewManager附加'error listeners'來處理這些事件 - (通常顯示錯誤模板)。如果您使用的是標準骨架應用程序the default error template will check the display_exceptions option,並且僅在啓用時才顯示錯誤。

0

內:Zend的\ DB \適配器\驅動程序\ PDO \連接

搜索線:

$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); 

我不知道有一種方法可以在全局覆蓋它,而無需在庫本身中進行更改。

0

這就是我該如何做的,insid e index.php

try { 
    include ROOT . '/init_autoloader.php'; 

    Zend\Mvc\Application::init(include 'config/application.config.php')->run(); 
} catch (Exception $e) { 
    if (IS_DEVELOPMENT_SERVER) 
     throw $e; 
    else { 
     echo('Error : ' . $e->getCode() . " " . $e->getMessage()); 
    } 
}