gpt4 book ai didi

php - Yii2:仅对 fatal error 使用错误处理程序或指定已处理的错误类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:33 26 4
gpt4 key购买 nike

Yii2 有它自己的 error handler , 将所有非致命的 php 错误转换为可捕获的异常。

是否可以仅将其用于处理 fatal error 或(更好)明确指定哪些错误应由 yii 错误处理程序处理,哪些应由内部 php 处理程序处理?

即在开发环境中,我希望所有错误都抛出异常并提供带有跟踪的错误页面。

但在生产环境中,我只希望出现 fatal error 以使用 yii 呈现错误页面,但通知和警告应该直接转到标准 php 日志而不抛出异常。

目前,如果我将 YII_ENABLE_ERROR_HANDLER 设置为 true,我会收到异常通知(我不希望它出现在产品上);如果我将它设置为 false,我会丢失 yii fatal error 页面;我将它设置为 true 并将 error_reporting 设置为 0,我丢失了错误日志记录。

最佳答案

编辑:我创建了一个 package实现下面描述的行为。

Yii2 的错误处理器不能这样配置。但是可以创建自己的错误处理程序,扩展 yii\web\ErrorHandler(或 yii\console\ErrorHandler 如果需要的话)。

namespace app\web;

use yii\web\ErrorHandler as BaseErrorHandler;

class ErrorHandler extends BaseErrorHandler {


/**
* @var array Used to specify which errors this handler should process.
*
* Default is ['fatal' => true, 'catchable' => E_ALL | E_STRICT ]
*
* E_ALL | E_STRICT is a default from set_error_handler() documentation.
*
* Set
* 'catchable' => false
* to disable catchable error handling with this ErrorHandler.
*
* You can also explicitly specify, which error types to process, i. e.:
* 'catchable' => E_ALL & ~E_NOTICE & ~E_STRICT
*/
public $error_types;

/**
* @var boolean Used to specify display_errors php ini setting
*/
public $display_errors = false;

/**
* @var string Used to reserve memory for fatal error handler.
*/
private $_memoryReserve;
/**
* @var \Exception from HHVM error that stores backtrace
*/
private $_hhvmException;

/**
* Register this error handler
*/
public function register()
{
// by default process all errors
// E_ALL | E_STRICT is a default from set_error_handler() documentation
$default_error_types = [ 'fatal' => true, 'catchable' => E_ALL | E_STRICT ];
// merge with application configuration
$error_types = array_merge($default_error_types, (array) $this->error_types);

ini_set('display_errors', $this->display_errors);
set_exception_handler([$this, 'handleException']);
if (defined('HHVM_VERSION')) {
set_error_handler([$this, 'handleHhvmError'], $error_types['catchable']);
} else {
set_error_handler([$this, 'handleError'], $error_types['catchable']);
}
if ($this->memoryReserveSize > 0) {
$this->_memoryReserve = str_repeat('x', $this->memoryReserveSize);
}
if ($error_types['fatal']) {
register_shutdown_function([$this, 'handleFatalError']);
}
}

}

然后可以配置错误处理程序:

'components' => [
'errorHandler' => [
'class' => 'app\web\ErrorHandler',
'error_types' => [
'fatal' => true,
'catchable' => YII_DEBUG ? (E_ALL | E_STRICT) : false
],
'display_errors' => ini_get('display_errors')
],
],

在此示例配置中,我们说错误处理程序应始终处理 fatal error ,但仅当我们处于 Debug模式时才处理可捕获的错误。在生产模式下,所有可捕获的错误都将由内部 php 错误处理程序处理,如果您对其进行配置,它们将出现在错误日志中。

display_errors 据说从 php.ini.htaccess 继承服务器 php 配置。

关于php - Yii2:仅对 fatal error 使用错误处理程序或指定已处理的错误类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com