【发布时间】:2018-03-16 10:11:02
【问题描述】:
我一直在寻找一个已经提出这个问题的现有问题,但我找不到任何能完全询问我想要弄清楚的问题。我能找到的最相似的问题是:php 5.3 avoid try/catch duplication nested within foreach loop (code sandwich)
好的,我工作的地方有一个带有 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 的装饰器语法,只是为了演示我在概念上的设想;我希望代码的行为更像这样:
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 中。有没有办法可以实现这种行为,所以我不必拥有所有这些重复代码的方法?还是我认为错误处理不正确?
感谢任何花时间回答这个问题的人。
【问题讨论】:
标签: php design-patterns error-handling try-catch