Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,有没有一种方法可以避免在一个类的多个方法中重复相同的try/catch代码?_Php_Design Patterns_Error Handling_Try Catch - Fatal编程技术网

在PHP中,有没有一种方法可以避免在一个类的多个方法中重复相同的try/catch代码?

在PHP中,有没有一种方法可以避免在一个类的多个方法中重复相同的try/catch代码?,php,design-patterns,error-handling,try-catch,Php,Design Patterns,Error Handling,Try Catch,我一直在寻找一个已经提出了这个问题的现有问题,但我没有找到任何问题,完全问我想弄明白什么。我能找到的最相似的问题是: 好的,我工作的地方有一个带有PHP后端的web应用程序。我们使用MVC类型的结构。我正在编写一个具有多个方法的控制器,在每个方法中,我用相同的try/catch代码包装代码。在catch中,我将异常、对类的引用和对函数的引用传递给构建错误消息的方法,以便在整个应用程序中对错误消息进行相同的格式化。它看起来像这样: class MyController { public

我一直在寻找一个已经提出了这个问题的现有问题,但我没有找到任何问题,完全问我想弄明白什么。我能找到的最相似的问题是:

好的,我工作的地方有一个带有PHP后端的web应用程序。我们使用MVC类型的结构。我正在编写一个具有多个方法的控制器,在每个方法中,我用相同的try/catch代码包装代码。在catch中,我将异常、对类的引用和对函数的引用传递给构建错误消息的方法,以便在整个应用程序中对错误消息进行相同的格式化。它看起来像这样:

class MyController {

    public function methodA() {
        try {
            // code for methodA
        } catch(Exception $e) {
            $errorMessage = Tasks::buildErrorMessage($e, __CLASS__, __FUNCTION__);
            throw new Exception($errorMessage);
        }
    }

    public function methodB() {
        try {
            // code for methodB
        } catch(Exception $e) {
            $errorMessage = Tasks::buildErrorMessage($e, __CLASS__, __FUNCTION__);
            throw new Exception($errorMessage);
        }
    }

    public function methodC() {
        try {
            // code for methodC
        } catch(Exception $e) {
            $errorMessage = Tasks::buildErrorMessage($e, __CLASS__, __FUNCTION__);
            throw new Exception($errorMessage);
        }
    }

}
因此,buildErrorMessage函数防止每个方法重复格式化错误消息的代码,但是有一件事让我非常困扰,那就是将相同的代码散布到类中的每个方法中。我知道PHP不支持类似python的decorator语法,但只是为了从概念上演示我的设想;我希望代码的行为更像这样:

class MyController {

    @DefaultErrorHandling()
    public function methodA() {
        // code for methodB
    }

    @DefaultErrorHandling()
    public function methodB() {
        // code for methodB
    }

    @DefaultErrorHandling()
    public function methodC() {
        // code for methodC
    }

}
其中@DefaultErrorHandling装饰程序将在该标准try/catch中包装每个方法。有没有一种方法可以实现这种行为,这样我就不必拥有所有这些重复代码的方法?还是我认为错误处理是错误的


感谢所有花时间回答这个问题的人。

您是否看过编写自定义异常处理程序并使用它的示例

你所做的似乎有点像重新发明轮子。异常是否还没有您在跟踪中收集的信息?见:


也许
buildErrorMessage
做得更多?无论如何,我假设您正在寻找一个自定义异常处理程序。

不确定是否有更好的方法来解决这个问题,但我创建了一个日志类,它为我格式化了日志。然后在我的接球区打电话


要记录正确的类和方法,我需要使用
debug\u backtrace()
函数。有关更多信息,请参阅此部分。

调用控制器方法的入口点可以使用try/catch包装这些调用。也就是说,如果您计划在这些方法上使用不同类型的错误处理程序,那么您可以在基本控制器(或使用trait)中实现一些东西,跟踪每个特定方法上应该调用哪个处理程序。差不多

<?php

class MyController extends Controller
{
    function __construct()
    {
        $this->setActionErrorHandler('function_name', 'handler');
    }
}

我认为这可能是获得我想要的东西的最好方式。谢谢