php - set_exception_handler 未捕获类异常
问题描述
我在这里和一般情况下进行了很多搜索,并且在发布之前已经尝试了我能想到的一切,但我无法弄清楚这一点。我敢肯定,一个体面的 php 人会立即知道问题所在,所以...
我有一个文件Db.phpabstract class Db
,其中包含require_once Config.php
.
Config.php包含,除其他外:
function global_exception_handler($e) {
mail(ADDR_TO, "Error", "ERROR: $e", "From: ".ADDR_FM);
}
set_exception_handler('global_exception_handler');
:: 如果我从Config.phpthrow new Exception("Test");
中的此代码下方抛出异常 - 例如, -它可以工作(收到电子邮件)。
:: 如果我在Db.php的 Db 类之外抛出异常,它会起作用。
:: 但是,如果我从 Db 类中抛出异常——例如,在我执行连接测试的构造函数中——什么都不会发生。
即使我将global_exception_handler
函数和set_exception_handler
声明移至 Db 类(使用类形式@set_exception_handler(array($this, 'global_exception_handler'))
),它也不会触发。
我知道我肯定遗漏了一些明显的东西,尽管我几乎可以肯定这在 Hostgator 将我们的服务器从 php 5.5 升级到 7.4 之前可以正常工作。
回答@WesselvanderLinden 的问题和代码请求...
(非常简单的)Db 类构造函数代码正在执行,并且只执行一次;
mail
我根据错误处理程序在其中添加了跟踪警报以对此进行测试。构造函数最初有一个,我在几个内务声明之后
Try...Catch
抛出了异常。Catch
我删除了所有的“噪音”,并将构造函数简化为简单的。Config.php文件包含在 ( ) Db.php文件中,处理程序语句如上所示。
require_once
这是基本的 Db 类构造函数代码(带有注释的运行检查跟踪电子邮件):
require_once "Config.php";
abstract class Db {
public function __construct() {
//mail(ADDR_TO, "Database Error", "ERROR!", "From: ".ADDR_FM);
throw new Exception("Database connection failed");
}
}
解决方案
让我们来看看
我创建了Config.php
:
<?php
function global_exception_handler($e) {
echo ADDR_TO, "Error", "ERROR: $e", "From: ".ADDR_FM;
}
set_exception_handler('global_exception_handler');
?>
然后index.php
;
<?php
require_once "Config.php";
const ADDR_TO = "to@example.com";
const ADDR_FM = "from@example.com";
abstract class Db {
public function __construct() {
throw new Exception("Database connection failed");
}
}
class MyDb extends Db {}
$db = new MyDB(); // run construct
?>
当我运行它时,我得到一个输出:
to@example.comErrorERROR: Exception: Database connection failed in /home/daniil/.../index.php:10
Stack trace:
#0 /home/daniil/.../index.php(19): Db->__construct()
#1 {main}From: from@example.com
似乎如你所料
推荐阅读
- php - Flutter Unhandled Exception: FormatException: Unexpected character (at character 4)
- sql - 如何从每一列的最大值的行中选择一个 ID?
- mongodb - 当每个字段都可搜索和可排序时,如何在 MongoDB 上正确构建索引?
- amazon-s3 - 使用目录结构在同一帐户中的两个存储桶之间同步对象
- node.js - Mocha/Chai 节点测试中的“之前”和“描述”块中的操作顺序
- android-bluetooth - 禁用按钮直到蓝牙连接
- java - 测试服务器处于生产模式
- html - 添加链接以将鼠标悬停在文本更改按钮上?
- javascript - 从 fetch API 响应中动态返回构建对象
- java - 无法使用 @JsonFormat 从 UTC 序列化 AEST 时区中的日期。为什么?