0

我正在向我的 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 块的稀疏性中?

4

2 回答 2

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;
}

就是这样。

于 2014-05-26T06:03:35.097 回答
0

一种方法可能是 AOP,另一种可能是使用 IOC 和内核之类的中间件(如 StackPHP),并将异常处理作为另一个中间件层。当然,如果您对控制流使用异常,则不能这样做,除非它在整个请求响应级别。

于 2014-04-22T12:14:00.557 回答