# Errors

> Every exception is a TryYourSizeError.

Source: https://docs.tryyoursize.com/reference/python/errors/

*Class* · `tryyoursize`

Every exception is a `TryYourSizeError`. API answers raise an `APIError` subclass by status: `InvalidRequestError` (400, 422; `issues` for garments), `AuthenticationError` (401), `PermissionDeniedError` (403), `NotFoundError` (404), `ConflictError` (409), `RateLimitError` (429, `retry_after`), `ServerError` (5xx). `APIConnectionError` when no answer came; `SignatureVerificationError` for webhooks.

```python
class APIError(TryYourSizeError)
```

## Attributes of APIError

- **`status`** (`int`, required): The HTTP status.
- **`code`** (`Optional[str]`, required): The stable error code ([API error codes](https://docs.tryyoursize.com/api/errors.md)).
- **`doc_url`** (`Optional[str]`, required): Link to the code's explanation.
- **`request_id`** (`Optional[str]`, required): Quote it to support.
- **`body`** (`Dict[str, Any]`, required): The parsed error body.
- **`issues`** (`list`, required): Garment issues of a 422; empty otherwise.

## Example

**Python**

```python
try:
    tys.products.retrieve("NO-SUCH-SKU")
except tryyoursize.NotFoundError:
    pass
except tryyoursize.APIError as err:
    print(err.status, err.code, err.request_id)
```

**Node.js**

```ts

try {
  await tys.products.retrieve("NO-SUCH-SKU");
} catch (err) {
  if (err instanceof RateLimitError) await sleep((err.retryAfter ?? 1) * 1000);
  else if (err instanceof TryYourSizeError) console.error(err.status, err.code, err.requestId);
}
```
