gpt4 book ai didi

整个类的 PHP Try Catch

转载 作者:可可西里 更新时间:2023-10-31 23:10:52 25 4
gpt4 key购买 nike

简单的问题,但似乎找不到答案。

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

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

因此,我希望我的类(class)中有一个区域可以捕获我从我的域模型中定义的任意数量的异常列表,并将它们作为更一般的异常抛出,例如

目前我这样做的方法是将对域对象的方法调用包装在 try catch block 中。随着我使用越来越多的域对象及其方法,这变得非常困惑。删除这些 try catch block 并在类中的一个位置处理它们会很好,即如果类中抛出任何异常,它会被类中定义的单个事件处理程序捕获

最佳答案

您可以使用代理类代表您执行调用并让您包装异常:

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() 魔术方法拦截并将方法调用转发给目标。

关于整个类的 PHP Try Catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24552600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com