为了账号安全,请及时绑定邮箱和手机立即绑定

PHP - 是否可以在 __destruct() 方法中使用自定义异常处理程序

PHP - 是否可以在 __destruct() 方法中使用自定义异常处理程序

PHP
慕村9548890 2022-07-29 10:22:33
有没有办法在类的方法中使用自定义异常处理程序,而不是默认异常处理程序__destruct?例如:function myExceptionHandler($e){    echo "custom exception handler";    if(is_object($e) && method_exists($e,'getMessage'))        echo $e->getMessage();}set_exception_handler('myExceptionHandler');class MyClass {    public function __construct()    {        // myExceptionHandler handles this exception        //throw new Exception("Exception from " . __METHOD__);    }    public function doStuff()    {        // myExceptionHandler handles this exception        //throw new Exception("Exception from " . __METHOD__);    }    public function __destruct()    {        // default exception handler         throw new Exception("Exception from " . __METHOD__);    }}$myclass = new MyClass();$myclass->doStuff();即使在方法set_exception_handler内调用__destruct,仍使用默认处理程序:    public function __destruct()    {        $callable = function($e)        {            echo "custom exception handler".PHP_EOL;            if(is_object($e) && method_exists($e,'getMessage'))                echo $e->getMessage();        };        set_exception_handler($callable);        throw new Exception("Exception from " . __METHOD__); // default exception handler    }
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

手册页

笔记:

尝试从析构函数(在脚本终止时调用)抛出异常会导致致命错误。

因此,首先在析构函数中使用异常可能是个坏主意。当脚本完成处理抛出的异常时,可能没有任何代码。

也许这段代码最好放在close()类的方法中。


查看完整回答
反对 回复 2022-07-29
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

也许是这样的?


<?php


class MyException extends Exception {

    public function __construct() {

        parent::__construct('my exception');

    }

}


class MyClass {

    public function __construct()

    {

        // myExceptionHandler handles this exception

        //throw new Exception("Exception from " . __METHOD__);

    }


    public function doStuff()

    {

        // myExceptionHandler handles this exception

        //throw new Exception("Exception from " . __METHOD__);

    }


    public function __destruct()

    {

        // default exception handler 

        throw new MyException();

    }


}


$myclass = new MyClass();

$myclass->doStuff();


查看完整回答
反对 回复 2022-07-29
  • 2 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信