【发布时间】:2019-11-16 03:39:38
【问题描述】:
假设我有一些使用try{...} catch() { ... } 块的代码。在尝试过的代码中,有各种重要的第三方对象(或者可能是其他数据)。
通常这些第三方对象会抛出自己的第三方异常;在不知道这些异常的实际名称的情况下如何确保捕获这些异常?
在代码的各个部分使用各种第三方对象和方法,是否有一种相对快速的方法可以捕获所有抛出的异常以供进一步调查?
详细使用示例(Stripe有很多异常情况)
$someObject = new \someNamespace\someClass();
try {
$x = $someObject->someFunction($someData);
$y = $stripeObject->StripeProcessing($x);
}
catch(\Stripe\Error\Card $ex) {
// Since it's a decline, \Stripe\Error\Card will be caught
error_log("Stripe Card Error: ".$ex->message);
$message = "There was a card error: ".$err['message'];
}
catch (\Stripe\Error\RateLimit |
\Stripe\Error\InvalidRequest |
\Stripe\Error\Authentication |
\Stripe\Error\ApiConnection |
\Stripe\Error\Base $ex) {
$message = "There was a Stripe error: ".$ex->getMessage();
error_log("Stripe Other Error: ".print_r($ex,true));
}
catch( \someNamespace\GiggityException |
\someNamespace\GiggityNewMexicoException){
error_log("Family Guy! ".print_r($ex,true));
}
catch (Exception $ex){
error_log("Elvis has died! ".print_r($ex,true));
}
可能导致:
PHP 致命错误:未捕获的 SomeDistributor\SomeClass\Exception:connection() 失败。 ……等等……等等……
所以上面有一堆异常要捕获,来自两个命名空间,以及最后的一般Exception;虽然对所有这些的代码反应非常相似;我似乎仍然需要知道每个抛出的异常类的名称,并手动编码;
那么,有没有办法在一个地方捕获所有可能的异常?
(在此之前根据需要区分和分支如何处理特定的)
我确信解决这个问题的方法非常简单,但我找不到这方面的文献(d'oh;我已经找到了文献)。
【问题讨论】:
-
可能值得在这里查看:php.net/manual/en/language.exceptions.extending.php - 我已经很好地看到了 Symfony 日志错误,可能值得检查它们的来源
-
@treyBake 谢谢。我不确定我是否要扩展标准的基本类,如果标准的
Exception无论如何都捕获了所有未捕获的异常,那很好,如果没有,我认为扩展它不会有帮助吗? -
视情况而定——您可以对类进行简单的扩展,为日志位置设置硬值,然后调用您的新“自定义”类
-
@treyBake 不,对不起,你是对的。我发现了一些涵盖这一点的文献:所有异常都扩展了基本类,所以是的,你是对的。谢谢:-)
-
没问题!很高兴我能帮上忙:)