抽象try / catch PHP - 条带错误处理

时间:2017-07-06 10:27:13

标签: php error-handling try-catch stripe-payments abstraction

我正在处理Stripe API中的错误 - 使用Stripe文档中提供的标准try / catch块,一切正常:

try {

  // Use Stripe's library to make requests...

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

  //card errors

  $body = $e->getJsonBody();
  $err  = $body['error'];

  print('Status is:' . $e->getHttpStatus() . "\n");
  print('Type is:' . $err['type'] . "\n");
  print('Code is:' . $err['code'] . "\n");
  print('Param is:' . $err['param'] . "\n");
  print('Message is:' . $err['message'] . "\n");

} catch (\Stripe\Error\RateLimit $e) {
  // Too many requests made to the API too quickly
} catch (\Stripe\Error\InvalidRequest $e) {
  // Invalid parameters were supplied to Stripe's API
} catch (\Stripe\Error\Authentication $e) {
  // Authentication with Stripe's API failed
  // (maybe you changed API keys recently)
} catch (\Stripe\Error\ApiConnection $e) {
  // Network communication with Stripe failed
} catch (\Stripe\Error\Base $e) {
  // Display a very generic error to the user, and maybe send
  // yourself an email
} catch (Exception $e) {
  // Something else happened, completely unrelated to Stripe
}

然而,这是很多代码,我发现自己重复它。我有点不知道怎么把它搞砸了。这样的事情是理想的:

try {

  // Use Stripe's library to make requests...

} // catch all errors in one line

1 个答案:

答案 0 :(得分:1)

有一个能为你处理它的功能:

function makeStripeApiCall($method, $args) {
    try {
        // call method
    } catch (...) {
        // handle error type 1
    } catch (...) {
        // handle error type 2
    } ...
}

现在:

  1. 如何通过$method?有几种方法可以做到这一点;例如:

    $method = 'charge';
    $this->stripe->{$method}($args);
    
    $method = [$stripe, 'charge'];
    call_user_func_array($method, $args);
    

    $method = function () use ($stripe, $args) { return $stripe->charge($args); };
    $method();
    

    选择最适合您情况的内容。

  2. 如何准确处理错误?

    您应该捕获特定的Stripe异常,并根据需要将它们转换为您自己的内部异常类型。您希望以不同的方式处理几种广泛的问题:

    1. 不良请求,例如卡被拒绝:您希望直接在调用业务逻辑代码中捕获这些错误并根据特定问题执行某些操作

    2. 服务中断,例如Stripe\Error\ApiConnection或费率限制:除了稍后重试之外,你不能对这些做很多事情,你会想要在更高的地方捕捉到这些错误并向用户提出"抱歉,试试再来一次"消息

    3. 配置错误,例如Stripe\Error\Authentication:没有什么可以自动完成的,您可以向用户显示500 HTTP服务器错误,响铃警报铃声并获取修改验证密钥的权限

    4. 这些基本上是您想要在内部定义的异常类型,然后根据需要捕获它们。 E.g:

      ...
      catch (\Stripe\Error\ApiConnection $e) {
          trigger_error($e->getMessage(), E_USER_WARNING);
          throw new TransientError($e);
      }
      ...
      

      完成所有这些后,您将减少对以下内容的API调用:

      try {
          return makeStripeApiCall('charge', $args);
      } catch (BadRequestError $e) {
          echo 'Card number invalid: ', $e->getMessage();
      }
      // don't catch other kinds of exception here,
      // let a higher up caller worry about graver issues