2017-04-18 43 views
0

我用Yii2与我的框架,因为我喜欢的ActiveRecord和QueryBuilder的。 Yii2 Official docs 介绍如何使用它。Yii2在ActiveRecord的第三方系统中。如何处理异常

它的工作原理,但Yii2需要PHP异常和警告的所有控制在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']); 
} 

我不知道该如何处理它。

例如,我有DBException形式的Yii。如果我设置了我自己的set_exception_handler,它将有非常差的有关异常的信息:只有代码和消息。这将是非常困难的调试它没有准备好的查询,查询参数等

如果我使用Yii2的异常处理程序 - 我要重写所有我与Yii2例外框架。这不太好,我也不喜欢Yii2字母和异常模板。我需要从Yii2开始使用DB。

你有任何想法如何,我可以解决这种情况呢?

+0

我认为你曲解它的工作方式。 Yii异常并不包含比默认PHP异常更多的信息,并且Yii错误处理程序处理每个异常,因此您不必重写代码。 Profiler会记录Yii 2中的SQL查询。 – Bizley

+0

我不太确定你想在这里取得成就。你想保留默认的PHP错误处理程序或什么? – xReprisal

回答

0

我意识到,Yii中的数据库的异常有关请求和错误的所有信息。此外,该例外还有一些其他信息的附加方法。这足以像往常一样控制框架中的所有异常和错误。

所以我再次rewrited的所有处理我的处理程序

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