2017-04-18 76 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)); 
}