加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP尝试捕获整个类

发布时间:2020-12-13 13:30:32 所属栏目:PHP教程 来源:网络整理
导读:简单的问题但似乎无法找到答案. 如果我有一个php类,是否可以为整个类注册一个异常处理程序? 我想这样做的原因是我的类使用属于我的域模型的对象.这些对象的方法抛出非常明显的异常.我不希望这些异常冒泡到更高级别的类,而是希望捕获所有这些异常并将它们作
简单的问题但似乎无法找到答案.

如果我有一个php类,是否可以为整个类注册一个异常处理程序?

我想这样做的原因是我的类使用属于我的域模型的对象.这些对象的方法抛出非常明显的异常.我不希望这些异常冒泡到更高级别的类,而是希望捕获所有这些异常并将它们作为更一般的例外抛出,例如DomainLayerException

因此,我希望我班级中的一个区域能够捕获我从域模型中定义的任意数量的例外列表,并将它们作为更一般的例外情况抛出,例如:

目前我这样做的方法是将方法调用包装到try catch块中的域对象.当我使用越来越多的域对象及其方法时,这变得非常混乱.很高兴删除这些try catch块并在类中的一个地方处理它们,即如果在类中抛出任何异常,它将被类中定义的单个事件处理程序捕获

您可以使用代理类代表您执行调用,并允许您包装异常:
class GenericProxy
{
    private $obj;
    private $handler;

    public function __construct($target,callable $exceptionHandler = null)
    {
        $this->obj = $target;
        $this->handler = $exceptionHandler;
    }

    public function __call($method,$arguments)
    {
        try {
            return call_user_func_array([$this->obj,$method],$arguments);
        } catch (Exception $e) {
            // catch all
            if ($this->handler) {
                throw call_user_func($this->handler,$e);
            } else {
                throw $e;
            }
        }
    }
}

$proxy = new GenericProxy($something,function(Exception $e) {
    return new MyCoolException($e->getMessage(),$e->getCode(),$e);
});
echo $proxy->whatever_method($foo,$bar);

它使用__call()魔术方法拦截并转发对目标的方法调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读