【问题标题】:Handling Multiple Exception Types For One Try Block为一次尝试块处理多种异常类型
【发布时间】:2018-04-01 21:38:01
【问题描述】:

是否有更简洁的方法来处理单个 try 块的多种异常类型?正如您将在下面看到的,我们有要为不同的 catch 语句执行的特定代码。

此函数是使用重复尝试捕获逻辑的众多函数之一。是否有可能以某种方式消除这种重复的捕获代码?

public function add_payment_method(Request $request){

    try{

        // Try to do some stuff

    } catch (\Stripe\Error\RateLimit $e) {

        /*
            CODE FOR THIS SPECIFIC EXCEPTION
        */

    } catch (\Stripe\Error\InvalidRequest $e) {


         /*
            CODE FOR THIS SPECIFIC EXCEPTION
        */


    } catch (\Stripe\Error\Authentication $e) {


         /*
            CODE FOR THIS SPECIFIC EXCEPTION
        */


    } catch (\Stripe\Error\Base $e) {


         /*
            CODE FOR THIS SPECIFIC EXCEPTION
        */


    } catch (\Stripe\Error\ApiConnection $e) {


         /*
            CODE FOR THIS SPECIFIC EXCEPTION
        */


    } catch (\Exception $e) {


         /*
            CODE FOR GENERIC EXCEPTION
        */


    }

}

【问题讨论】:

  • 捕获Stripe\Error\Base 而不是特定的

标签: php exception-handling


【解决方案1】:

所有这些错误都扩展Stripe\Error\Base,因此捕获Stripe\Error\Base 应该涵盖更具体的错误。

也就是说,Stripe 提供了不同的异常类型,因为您应该针对不同的类型执行不同的操作。 RateLimit 异常是您应该排队并稍后重试的事情。 Card 异常是您应该返回给用户修复的问题。 Authentication 错误可能意味着您的整个应用程序无法使用信用卡,因为您的 API 令牌丢失/错误并且您正在损失 $$$。

【讨论】:

    【解决方案2】:

    Catching multiple exception types in one catch block

    除了一千个ifelse,一个人可以做

    catch (Exception $e) {
        switch ($e) {
            case $e instanceof Exception1:
                ...;
                break;
            case $e instanceof Exception2:
                ...;
                break;
            default:
                ...;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 2013-03-14
      • 1970-01-01
      • 2012-01-16
      • 2011-11-23
      相关资源
      最近更新 更多