首页 > 解决方案 > 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 的问题和代码请求...

  1. (非常简单的)Db 类构造函数代码正在执行,并且只执行一次;mail我根据错误处理程序在其中添加了跟踪警报以对此进行测试。

  2. 构造函数最初有一个,我在几个内务声明之后Try...Catch抛出了异常。Catch我删除了所有的“噪音”,并将构造函数简化为简单的。

  3. 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");
    }
}

标签: phpphp-7

解决方案


让我们来看看

我创建了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

似乎如你所料


推荐阅读