1

我有一个使用 ZendFramework 的非常大的 Web 应用程序。好像某处某个SQL语句有语法错误(很多东西是自动生成的),但是记录的错误非常无用(项目信息被删除)

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near [...] in [...]/ZendFramework/Zend/Db/Statement/Pdo.php:228
Stack trace:
#0 [...]/ZendFramework/Zend/Db/Statement/Pdo.php(228): PDOStatement->execute(Array)
#1 [...]/ZendFramework/Zend/Db/Statement.php(300): Zend_Db_Statement_Pdo->_execute(Array)
#2 [...]/ZendFramework/Zend/Db/Adapter/Abstract.php(479): Zend_Db_Statement->execute(Array)
#3 [...]/ZendFramework/Zend/Db/Adapter/ in [...]/ZendFramework/Zend/Db/Statement/Pdo.php on line 234

此堆栈跟踪仅包含 Zend 框架内的引用,并且看不到实际的调用者(最有可能出现语法错误的地方)。

每当发生错误时,如何让 Zend Framework 为我提供完整的堆栈跟踪?

4

2 回答 2

2

这些异常应该由您的ErrorController()或您作为 ErrorController 传递的任何东西)通常在默认模块(application/controllers/ErrorController.php)中记录。如果是这种情况,更改日志记录机制应该很简单。

可能只需要进行一些实验即可确定需要使用哪些Exception()方法来获得所需的输出。

[编辑]

我应该注意到,如果您使用默认错误设置,该视图将是一个简单的更新位置:

<!-- application/views/scripts/error/error.phtml -->
<html>
    <body>
        <h1>An error occurred</h1>
        <h2><?php echo $this->message ?></h2>
        <?php if (isset($this->exception)): ?>
            <h3>Exception information:</h3>
            <p>
                <b>Message:</b> <?php echo $this->exception->getMessage() ?>
            </p>
            <h3>Stack trace:</h3>
            <pre><?php echo $this->exception->getTraceAsString() ?>
            <!-- add full Trace info -->
            <pre><?php echo $this->exception->getTrace() ?></pre>
            </pre>
            <h3>Request Parameters:</h3>
            <pre><?php echo $this->escape(var_export($this->request->getParams(), true)) ?>
            </pre>
        <?php endif ?>
    </body>
</html>
于 2012-12-28T14:28:46.507 回答
1

如果您需要更详细的堆栈跟踪,可以使用:

foreach($this->exception->getTrace() as $t){
        var_dump($t);
    }

这里提到。但我认为你会更好地使用 firebug 和 firephp 并使用 Zend_Debug_Profiler_Firebug 类调试 sql 查询,如这里这里这里有用的文章中所述。

于 2012-12-27T11:38:21.453 回答