在PHP中,有没有一种方法可以避免在一个类的多个方法中重复相同的try/catch代码?
我一直在寻找一个已经提出了这个问题的现有问题,但我没有找到任何问题,完全问我想弄明白什么。我能找到的最相似的问题是: 好的,我工作的地方有一个带有PHP后端的web应用程序。我们使用MVC类型的结构。我正在编写一个具有多个方法的控制器,在每个方法中,我用相同的try/catch代码包装代码。在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
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');
}
}
我认为这可能是获得我想要的东西的最好方式。谢谢