Skip to main content

Error Handling

The SDK does not wrap errors in its own exception classes — it lets Guzzle raise its own exceptions, so you catch the same exceptions you would from any other Guzzle-based code:

use GuzzleHttp\Exception\GuzzleException;

try {
$audio = $dhivehigpt->tts()->generate($text, $voice);
} catch (GuzzleException $exception) {
report($exception);
}

Exception types

ExceptionThrown when
GuzzleHttp\Exception\ClientExceptionThe API responded with a 4xx status — e.g. a missing/invalid/revoked API key (401), insufficient credits (403), not found (404), a validation error (422), or the rate limit of 60 requests per minute was exceeded (429).
GuzzleHttp\Exception\ServerExceptionThe API responded with a 5xx status.
GuzzleHttp\Exception\ConnectExceptionThe request could not connect at all — a DNS failure, connection timeout, etc.
GuzzleHttp\Exception\RequestExceptionThe base class for the exceptions above — the common type to catch if you don't need to distinguish between them. It also exposes getResponse().
GuzzleHttp\Exception\GuzzleExceptionThe interface implemented by every exception above — catch this if you just want to handle "the request failed" in general.

Reading the response body

ClientException and ServerException both expose the failed response via getResponse(). The DhivehiGPT API always returns a JSON body with a message key, and a errors key for validation failures (HTTP 422):

use GuzzleHttp\Exception\ClientException;

try {
$dhivehigpt->tasks()->calculate('not-a-real-task', 1000);
} catch (ClientException $exception) {
$data = json_decode((string) $exception->getResponse()->getBody(), true);

$message = $data['message']; // 'The selected task is invalid.'
$errors = $data['errors'] ?? []; // ['task' => ['The selected task is invalid.']]
}