What I am trying to do is build a Stripe-specific exception class to handle any Stripe-related exception:
try {
$stripeCustomer = $user->asStripeCustomer();
$defaultPaymentMethodId = $stripeCustomer->invoice_settings->default_payment_method;
return $defaultPaymentMethodId;
} catch(\Stripe\Exception\CardException $e) {
// Since it's a decline, \Stripe\Exception\CardException will be caught
echo 'Status is:' . $e->getHttpStatus() . '\n';
echo 'Type is:' . $e->getError()->type . '\n';
echo 'Code is:' . $e->getError()->code . '\n';
// param is '' in this case
echo 'Param is:' . $e->getError()->param . '\n';
echo 'Message is:' . $e->getError()->message . '\n';
} catch (\Stripe\Exception\RateLimitException $e) {
// Too many requests made to the API too quickly
} catch (\Stripe\Exception\InvalidRequestException $e) {
// Invalid parameters were supplied to Stripe's API
} catch (\Stripe\Exception\AuthenticationException $e) {
// Authentication with Stripe's API failed
// (maybe you changed API keys recently)
} catch (\Stripe\Exception\ApiConnectionException $e) {
// Network communication with Stripe failed
} catch (\Stripe\Exception\ApiErrorException $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
return [false, '$e->getError()->message', null];
}
I would like to move all this exception logic (for Stripe) from my Controller above into an exception class.
What is the correct (Laravel) way to handle exceptions? How would you do it?
Some context:
When Laravel 7.x came out, according to the upgrade guide I believe there was a symfony-related update on how exceptions were handled.
Not sure if the php artisan make:exception command has been updated, but running php artisan make:exception MyStripeException generates a file like this
<?php
namespace App\Exceptions;
use Exception;
class MyStripeException extends Exception
{
//
}
However, if you look at app\Exceptions\Handler.php it looks more like this
<?php
namespace App\Exceptions;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];
/**
* Report or log an exception.
*
* @param \Throwable $exception
* @return void
*
* @throws \Exception
*/
public function report(Throwable $exception)
{
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Throwable $exception
* @return \Symfony\Component\HttpFoundation\Response
*
* @throws \Throwable
*/
public function render($request, Throwable $exception)
{
return parent::render($request, $exception);
}
}
Confused how to proceed - how would you build the exception class for Stripe?