【问题标题】:PHP how be sure to catch all exceptionsPHP如何确保捕获所有异常
【发布时间】: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 不,对不起,你是对的。我发现了一些涵盖这一点的文献:所有异常都扩展了基本类,所以是的,你是对的。谢谢:-)
  • 没问题!很高兴我能帮上忙:)

标签: php class exception


【解决方案1】:

This website 状态:

捕获异常的最简单方法是使用通用的 try-catch 块。因为异常是对象,所以它们都扩展了一个内置的 Exception 类(参见 Throwing Exceptions in PHP),这意味着捕获每个抛出的异常就像对全局异常对象进行类型提示一样简单,这通过在前面添加反斜杠来表示:

try {
  // ...
} catch ( \Exception $ex ) {
  // ...
}

【讨论】:

    猜你喜欢
    • 2011-10-12
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多