我正在为我的PHP代码添加异常处理。似乎我最终得到了许多稀疏块,这些稀疏块执行异常处理,并且它们的庞大体积隐藏了正在运行的实际生产代码。例如:
function loadProduct($id)
{
$product = new ProductRecord();
try
{
$data = $product->loadFromDatabase($id);
}
catch (\BadFunctionCallException $e)
{
$error = true;
}
return $data;
}
上述函数的实际有效负载是返回$ data。没有异常处理,它可能是一个2行函数:
function loadProduct($id)
{
$product = new ProductRecord();
return $product->loadFromDatabase($id);
}
隐藏此方法的一种方法是使用Factory Method
,例如:
function loadProduct($id)
{
$product = new ProductRecord();
$factory = new ProductFactory($product);
return $factory->loadProduct($id); //inside loadProduct I can put try/catch block
}
这里我在我的函数中添加了一个全新的(工厂)类和另一行代码来隐藏我的异常处理。经过适当的注意,我认为这样可以工作并且看起来仍然很好(即我可以在构造函数中初始化我的工厂,从而将其移出功能级代码,因此它可能是一个不错的选择)。但这是最好的吗?
换句话说,我的问题是 - 如何在我的代码中使用异常处理而不将实际有效负载埋入try / catch块的稀疏性中?
答案 0 :(得分:2)
这是一个例子,如何用Go来解决你的问题! AOP框架和Around
建议:
/**
* This advice intercepts an execution of some methods
*
* Logic is pretty simple: we wrap an original method with our advice
* and catch all exceptions in one place.
*
* @param MethodInvocation $invocation Invocation
*
* @Around("execution(public SomeClassName->*(*)")
*/
public function aroundPublicMethods(MethodInvocation $invocation)
{
try {
$result = $invocation->proceed(); // invoke original method
} catch (\Exception $e) {
$result = $e; // exception will be returned as a result to method call
}
return $result;
}
就是这样。
答案 1 :(得分:0)
一种方法可能是AOP,另一种方式可能是使用IOC和内核,如StackPHP之类的中间件,只是将异常处理作为另一个中间件层。当然,如果您使用控制流异常,除非它处于整个请求响应级别,否则您无法做到这一点。