我在我的框架中使用Yii2因为我喜欢ActiveRecord和QueryBuilder。 Yii2 Official docs 描述了如何使用它。
它可以工作,但是Yii2可以在ErrorHandler.php
/**
* Register this error handler
*/
public function register()
{
ini_set('display_errors', false);
set_exception_handler([$this, 'handleException']);
if (defined('HHVM_VERSION')) {
set_error_handler([$this, 'handleHhvmError']);
} else {
set_error_handler([$this, 'handleError']);
}
if ($this->memoryReserveSize > 0) {
$this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);
}
register_shutdown_function([$this, 'handleFatalError']);
}
我不知道如何处理它。
例如,我有Yii的DBException格式。如果我设置了自己的set_exception_handler
,那么关于异常的信息就会很少:只有代码和消息。没有准备好的查询,查询参数等,调试它将非常困难。
如果我使用Yii2的异常处理程序 - 我必须用Yii2异常重写我的所有框架。这不好,我不喜欢Yii2字母和异常模板。我从Yii2得到的只是与DB合作。
您有什么想法我该如何解决这种情况?
答案 0 :(得分:0)
我意识到,Yii的数据库异常包含有关请求和错误的所有信息。此外,Exception还有一些其他信息的附加方法。这足以像往常一样控制我的框架的所有异常和错误。
所以我再次将所有处理程序重新编写给我的处理程序
spl_autoload_register(array("MyClass", 'autoload'));
set_exception_handler(['MyClass','exceptionHandler']);
set_error_handler(['MyClass','errorHandler']);
并将所有有用的信息收集到错误body
$body .= "Error: " . $e->getMessage() . PHP_EOL;
$body .= "File: " . $e->getFile() . ":" . $e->getLine() . PHP_EOL;
$body .= "Trace:" .$e->getTraceAsString() . PHP_EOL;
$prev = $e->getPrevious();
if ($prev) {
$body .= "Next To: ";
$body .= get_class($prev)." ".PHP_EOL;
$body .= $prev->getMessage();
}
if ($e instanceof yii\db\Exception) {
$body .= "Additional Info: " . (print_r($e->errorInfo, true));
}