Yii2:仅对致命错误使用错误处理程序或指定处理的错误类型

2024-01-31

Yii2有它自己的错误处理程序 http://www.yiiframework.com/doc-2.0/guide-runtime-handling-errors.html,它将所有非致命 php 错误转换为可捕获的异常。

是否可以仅使用它来处理致命错误或(更好)明确指定哪些错误应由 yii 错误处理程序处理,哪些应由内部 php 处理程序处理?

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

但在产品环境中,我只想用 yii 渲染错误页面的致命错误,但通知和警告应该只转到标准 php 日志而不抛出异常。

目前如果我设置YII_ENABLE_ERROR_HANDLER to true,我在通知上得到了例外(我不希望在产品上得到它);如果我将其设置为false,我丢失了 yii 致命错误页面;我将其设置为true并设置error_reporting to 0,我失去了错误记录。


EDIT:我创建了一个package https://github.com/cronfy/yii2-web-errorhandler实现下面描述的行为。

Yii2 的错误处理程序不能以这种方式配置。但可以创建自己的错误处理程序,扩展yii\web\ErrorHandler (or 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')
    ],
],

在此示例配置中,我们说错误处理程序应始终处理致命错误,但仅在处于调试模式时才处理可捕获的错误。在生产模式下,所有可捕获的错误都将由内部 php 错误处理程序处理,并且如果您配置它,将显示在错误日志中。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii2:仅对致命错误使用错误处理程序或指定处理的错误类型 的相关文章

  • 如何从 Laravel 中的表中选择所有列名称?

    我试图从表中获取所有列名Teller 功能 public function getTableColumns tables return DB select DB raw SELECT COLUMN NAME DATA TYPE COLUMN
  • gmail 不断阻止 PHPmailer 登录

    我将在接下来的 8 小时内部署一个网站 而 Gmail 刚刚停止接受 PHPmailer 登录我的帐户 起初 它在测试过程中工作了几个小时 然后 它就停止工作了 我已经允许所有允许不太安全的应用程序从 gmail 登录 但它仍然不允许 ph
  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • MySQL/PDO::quote() 尽管使用 PDO::PARAM_INT 参数,但仍在整数周围加上引号

    无论我传递给什么值 数据类型对 它都会出现 pdo gt quote value type 它总是将其引用为字符串 echo pdo gt quote foo PDO PARAM STR foo as expected echo pdo g
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 如何使用 php 发送服务器错误响应?

    一旦用户点击删除按钮我的 jQuery 脚本要求服务器删除所选项目 现在我想要我的php发送成功或错误响应的脚本 是否有可能触发错误回调万一该项目无法删除 Thanks 我的 jQuery 代码 ajax type post url myA
  • 如何使用 php 下载/打印页面的特定部分

    我有一个 HTML 页面如下 Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ipsum has been the indust
  • 蛋糕控制台 2.2.1:烘焙错误

    运行 MAMP 的 OSX 机器 CakePHP 2 2 1 已正确安装和配置 这意味着当我浏览到 Index php 文件时 所有绿色条都显示出来 我已经完成了博客教程 并且正在开发我的第二个应用程序 其中脚手架已启动并运行 现在我第一次
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 在 PHP 中使用 phpseclib 时出现 RSA 问题

    我正在尝试在 phpseclib 中使用 RSA 实现 我认为在函数中执行一次代码并重新使用该函数会更容易 当我尝试向代码发送短信时 我收到一条错误消息 提示 解密错误 测试还让我意识到每次代码运行时密文都是不同的 所以我显然在那里做错了什
  • 随机组合 MySQL 数据库中的两个单词

    我有一个包含名词和形容词的数据库 例如 id type word 1 noun apple 2 noun ball 3 adj clammy 4 noun keyboard 5 adj bloody ect 我想创建一个查询 它将抓取 10
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • php,统计字符并删除超过140个字符的内容

    我需要一个 PHP 函数来计算短语的字符数 如果短语长度超过 140 个字符 则此函数应删除所有其他字符并在短语末尾添加三个点 例如我们有 message I am what I am and you are what you are et
  • ini_set 'session.gc_maxlifetime' 为 1 天

    If I do ini set session gc maxlifetime 86400 这是否意味着用户可以将浏览器留在同一页面 非活动状态 最多 1 天 而不必担心会话被垃圾收集并被注销 如果服务器配置不支持此功能会发生什么 它会给我一
  • 对具有混合类型值的数组进行数字排序

    我有一个像这样的混合数组 fruits array lemon Lemon 20 banana apple 121 40 50 然后申请sort 其功能如下 sort fruits SORT NUMERIC foreach fruits a

随机推荐

  • 数组中所有元素的总和

    我是编程初学者 我想计算数组中所有元素的总和 我做了这个 但我看不出我的错误在哪里 function ArrayAdder array this sum 0 this array array ArrayAdder prototype com
  • python 按不同标准对元组进行排序

    我有一个清单a 1 a 1 b 2 c 我想得到这个列表 2 c 1 a 1 b 如果我这样做 sorted a reverse True 我只能得到 2 c 1 b 1 a 我怎样才能得到我想要的列表 如果您想保留原始列表中的排序顺序 但
  • 如何通过 SoundCloud API 添加评论

    我想通过 SoundCloud API 发表评论 但查看文档 http developers soundcloud com docs api reference tracks这似乎是不可能的 唯一可用的方法 tracks id commen
  • 为什么 React 需要 Babel 和 Webpack 才能工作?

    我正在查看 vue js 的 wiki 页面 看到了这个 与 React 开发相比 Vue 可以集成到 现有的 Web 应用程序更加容易 通常 Web 应用程序 只需包含 Vue js 即可立即开始使用 Vue JavaScript 库 与
  • ASP.NET MVC 中的超快速文本到语音 (WAV -> MP3)

    这个问题本质上是关于微软的语音API SAPI 对于服务器工作负载的适用性以及它是否可以在内部可靠地使用 w3wp用于语音合成 我们有一个异步控制器 它使用本机System Speech NET 4 中的程序集 不是Microsoft Sp
  • 如何刷新 Google OAuth2 AccessToken

    我见过很多问题 https stackoverflow com questions 22357348 google apis client for csharp auth using refresh token关于这个问题有不同的答案 有些
  • 一次循环遍历 2 个列表

    我有两个长度相同的列表 是否可以同时循环这两个列表 我正在寻找正确的语法来执行以下操作 foreach itemA itemB in ListA ListB Console WriteLine itemA ToString itemB To
  • 如何对向量列表执行成对运算(如“%in%”)和集合运算

    这个问题的动机是如何快速查看 R 中多个向量的任何元素是否相等 https stackoverflow com q 39060567 4891738 但不相同 重复 作为一个小例子 假设我们有一个包含 4 个向量的列表 set seed 0
  • 通过 wsHttpBinding 在 PHP 中调用 WCF WebService

    我有一个 WCF Web 服务 我可以通过 basicHttp 连接到它 但不能通过 wsHttp 连接到它 我尝试通过以下方式通过 wshttp 连接到它 service new SoapClient http service compa
  • Angular 5 Service Worker 不工作/不缓存背景图像

    我无法让我的 Angular5 Service Worker 工作 我有两个主要问题 Service Worker 不会缓存用作背景图像的资产图像 模拟网络断开连接后 服务工作人员最初从缓存中提取文件 上述非缓存文件除外 但在第二次刷新后会
  • SQL 更新可选参数 PHP

    我们想要改变将值从 PHP 传递到存储过程 T SQL 的方式 我对 PHP 只有很少的经验 但我将尝试通过与我们的 Web 开发人员的讨论来解释该过程 当前流程 测试表示例 为了更新记录 例如本示例中的 Field3 我们会将所有现有值传
  • 从 select 将记录插入到 OrientDB 类的嵌入字段中

    我正在评估 OrientDB 数据库 我有两个从关系数据库导入的文档类 class Order with properties ID integer OrderItems EmbeddedList of OrderItem and clas
  • 如何访问主项目中的子项目头文件

    我有一个主项目和另一个作为子项目添加的项目 我想将子项目中定义的头文件访问到主项目中 但不幸的是它说文件找不到错误 请查看附件图片 我应该修改什么来访问子项目的头文件 您需要将子项目的路径添加到search path for headers
  • 将实体中的列表转换为数据库中的单个字符串列

    我有一个VARCHAR我的数据库中的字段 该字段的值为val1 val2 val3 是否可以将其设置为ArrayList
  • 在 Pig 中编写 udf 有点像教程

    我是 Pig 新手 并且正在尝试编写 udf 函数 所以基本上这是问题陈述 我有一个这样的虚拟数据 user id movie id date time stamp 所以我想做的就是这个 如果交易是在 9 am and 11 am gt b
  • 为什么 C# 方法不返回值?

    很容易理解为什么method 返回一个值 但我无法理解不返回值的方法的概念 static void PrintName string firstName string lastName Console Writeline firstName
  • 使用 nltk 从德语文本中提取单词

    我正在尝试从德语文档中提取单词 当我使用 nltk 教程中描述的以下方法时 我无法获取具有特定于语言的特殊字符的单词 ptcr nltk corpus PlaintextCorpusReader Corpus words nltk Text
  • 使用 csv 阅读器在文本文件中保留双引号

    您好 我有一个带有字符串的文本文件 你好 foo 酒吧 我想将其分成一个列表 hello foo bar 有什么办法可以实现这个目标吗 我现在正在尝试这个 for line in sys stdin csv file StringIO St
  • 如何为 Xcode 构建和编译 PJSIP,使用示例代码 IPJSUA 进行测试?

    如何使用xCode构建和编译PJSIP并运行示例代码IPJSUA 首先 您需要打开终端 终端可以在应用程序 gt 实用程序 gt 终端中找到 打开终端后 请确保指向桌面 以便更轻松地获取数据文件夹 只需输入 光盘桌面 恭喜 您已经进入桌面了
  • Yii2:仅对致命错误使用错误处理程序或指定处理的错误类型

    Yii2有它自己的错误处理程序 http www yiiframework com doc 2 0 guide runtime handling errors html 它将所有非致命 php 错误转换为可捕获的异常 是否可以仅使用它来处理