假设我有一个父类:
class Parent {
//...
}
和一个带有方法的子类:
class Child extends Parent {
public function foo() {
// process and return data
}
public function bar() {
// process and return data
}
// way more methods...
}
然后在PHP中有一种通用的方法来处理子方法中抛出的任何异常吗?例如,Parent类中的处理程序?或者我是否需要将所有方法体包装在一个单独的try-catch块中?
我想要实现的是,如果任何子方法抛出任何异常,则返回空array()
。
答案 0 :(得分:1)
是的,这是可能的。好吧,父母无法知道所有可能的子方法,但可以知道何时通过实施__call
magic method来调用未定义的方法。< / p>
我们可以使用此方法动态创建try-catch“包装器”。
将此方法添加到您的父级:
public function __call($method, $args)
{
// If method call ends with 'Safe'
$isSafeMethod = substr($method, -strlen('Safe')) === 'Safe';
if (!$isSafeMethod) {
trigger_error('Call to undefined method '.__CLASS__.'::'.$method.'()', E_USER_ERROR);
return null;
}
// Strip 'Safe' suffix from method name
$wrappedMethodName = substr($method, 0, strpos($method, 'Safe'));
try {
return $this->$wrappedMethodName($args);
} catch (Exception $e) {
return [];
}
}
现在,只要您想调用此try-catch包装器,只需将“Safe”附加到要包装的方法名称即可。完整代码+示例:
class TestParent {
public function __call($method, $args)
{
// If method call ends with 'Safe'
$isSafeMethod = substr($method, -strlen('Safe')) === 'Safe';
if (!$isSafeMethod) {
trigger_error('Call to undefined method '.__CLASS__.'::'.$method.'()', E_USER_ERROR);
return null;
}
// Strip 'Safe' suffix from method name
$wrappedMethodName = substr($method, 0, strpos($method, 'Safe'));
try {
return $this->$wrappedMethodName($args);
} catch (Exception $e) {
return [];
}
}
}
class TestChild extends TestParent {
public function throwingMethod()
{
throw new RuntimeException();
}
public function succeedingMethod()
{
return 'Success';
}
}
$child = new TestChild();
// With 'Safe' try-catch invoked in parent
var_dump($child->throwingMethodSafe()); // Empty array
var_dump($child->succeedingMethodSafe()); // 'Success'
// Without 'Safe' try-catch
var_dump($child->throwingMethod()); // throws RuntimeException as expected
旁注:请不要抓住Exception
类,因为它太笼统了,以后会调试一个活生生的地狱(“为什么这个方法会返回一个数组?”)
答案 1 :(得分:-1)
根据我的个人经验,创建自定义异常处理程序并在获得该异常时返回空数组。 这些链接将帮助您理解PHP中的异常处理: https://www.w3schools.com/php/php_exception.asp http://php.net/manual/en/language.exceptions.php