用于ActiveRecord的第三方系统中的Yii2。如何处理异常

时间:2017-04-18 10:19:47

标签: php activerecord yii exception-handling yii2

我在我的框架中使用Yii2因为我喜欢ActiveRecord和QueryBuilder。 Yii2 Official docs 描述了如何使用它。

它可以工作,但是Yii2可以在ErrorHandler.php

中完全控制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合作。

您有什么想法我该如何解决这种情况?

1 个答案:

答案 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));
}