Try 到底什么时候变成 Catch?

When exactly does Try become Catch?

我有一个尝试使用 Stripe 处理付款的 Try / Catch 块。我想检查如果 Charge::create 方法中有错误,那么 TRY 块中的其余代码将不会继续执行?否则我的数据库将被更新并且客户将收到电子邮件,即使他们的付款没有通过。

有人可以为我阐明 Try / Catch 的行为吗?

try {
  $charge = \Stripe\Charge::create(array(
    "amount" => $charge_amount, // amount in cents, again
    "currency" => CURRENCY,
    "source" => $token,
    "description" => $description,
    "receipt_email" => $email,
    "metadata" => $metadata)
  );

//adjust inventory
foreach ($_SESSION['cart'] as $item => $quantity)
{
  $db->query("UPDATE stock SET stock = stock - '$quantity', reserved = reserved + '$quantity' WHERE id = '$item'");
}
unset($_SESSION['cart']);
//update cart
$db->query("UPDATE cart SET paid = 1 WHERE id = '$cart_id'");

blah blah, lots of other stuff...

} catch(\Stripe\Error\Card $e) {
  // The card has been declined
  echo $e;
}

是的,正是这样。

(几乎)任何编程语言中的 try...catch 块基本上都会尝试 运行 您块中的代码,但会在遇到错误(特别是异常)时停止,并且将被捕获​​并按指示处理 - 假设 catch 块 运行 成功,然后执行将在 try...catch 块结束后继续(除非您退出执行作为 catch 语句的一部分)。

抛出错误时try变成catch。这意味着如果 \Stripe\Charge::Create 方法失败,它将立即转到您的 catch 块并绕过数据库更新、客户电子邮件和所有其他内容。

话虽如此,您可能仍想在向客户收费和其他处理之间对代码进行更多检查。至少检查 $charge->paid == true。要更加小心(我们在这里谈论的是钱)检查 livemode 是否正确,货币是你的货币(美元?)并且金额是你期望的。

查看 Larry Ullman 的网站了解如何处理条带错误以获取更多信息: http://www.larryullman.com/2013/01/30/handling-stripe-errors/

还有:
http://www.larryullman.com/2013/01/09/writing-the-php-code-to-process-payments-with-stripe/