The official Python library for the anthropic API
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Complete exception hierarchy and error handling patterns for the Anthropic Python SDK.
AnthropicError
├── APIError
│ ├── APIStatusError
│ │ ├── BadRequestError (400)
│ │ ├── AuthenticationError (401)
│ │ ├── PermissionDeniedError (403)
│ │ ├── NotFoundError (404)
│ │ ├── ConflictError (409)
│ │ ├── RequestTooLargeError (413)
│ │ ├── UnprocessableEntityError (422)
│ │ ├── RateLimitError (429)
│ │ ├── InternalServerError (≥500)
│ │ ├── ServiceUnavailableError (503)
│ │ ├── DeadlineExceededError (504)
│ │ └── OverloadedError (529)
│ ├── APIConnectionError
│ ├── APITimeoutError
│ └── APIResponseValidationErrorclass AnthropicError(Exception):
"""Base exception for all Anthropic errors."""
...
class APIError(AnthropicError):
"""Base for all API-related errors."""
message: str
request: httpx.Request | None
body: object | Noneclass APIStatusError(APIError):
"""HTTP status code error."""
response: httpx.Response
status_code: int
request_id: str | None
class BadRequestError(APIStatusError):
"""400 - Invalid request."""
...
class AuthenticationError(APIStatusError):
"""401 - Invalid API key."""
...
class PermissionDeniedError(APIStatusError):
"""403 - Insufficient permissions."""
...
class NotFoundError(APIStatusError):
"""404 - Resource not found."""
...
class ConflictError(APIStatusError):
"""409 - Request conflicts with current state."""
...
class RequestTooLargeError(APIStatusError):
"""413 - Request payload too large."""
...
class UnprocessableEntityError(APIStatusError):
"""422 - Request semantically invalid."""
...
class RateLimitError(APIStatusError):
"""429 - Rate limit exceeded."""
...
class InternalServerError(APIStatusError):
"""500+ - Server error."""
...
class ServiceUnavailableError(APIStatusError):
"""503 - Service temporarily unavailable."""
...
class DeadlineExceededError(APIStatusError):
"""504 - Request exceeded deadline."""
...
class OverloadedError(APIStatusError):
"""529 - Service overloaded."""
...class APIConnectionError(APIError):
"""Failed to connect to API."""
...
class APITimeoutError(APIError):
"""Request timed out."""
...
class APIResponseValidationError(APIError):
"""Response validation failed."""
...class ErrorObject(BaseModel):
"""Error object in API responses."""
type: str
message: str
class ErrorResponse(BaseModel):
"""Error response wrapper."""
type: Literal["error"]
error: ErrorObjectfrom anthropic import APIError
try:
message = client.messages.create(...)
except APIError as e:
print(f"Error: {e.message}")from anthropic import (
RateLimitError,
AuthenticationError,
BadRequestError,
)
try:
message = client.messages.create(...)
except RateLimitError as e:
retry_after = e.response.headers.get("retry-after")
print(f"Rate limited. Retry after {retry_after}s")
except AuthenticationError:
print("Invalid API key")
except BadRequestError as e:
print(f"Invalid request: {e.message}")import time
from anthropic import RateLimitError, InternalServerError
def create_message_with_retry(max_retries=3):
for attempt in range(max_retries):
try:
return client.messages.create(...)
except (RateLimitError, InternalServerError) as e:
if attempt == max_retries - 1:
raise
wait_time = 2 ** attempt
print(f"Retry {attempt + 1} after {wait_time}s")
time.sleep(wait_time)from anthropic import APIStatusError
try:
message = client.messages.create(...)
except APIStatusError as e:
print(f"Request ID: {e.request_id}")
print(f"Status: {e.status_code}")from anthropic import APIResponseValidationError
try:
message = client.messages.create(...)
except APIResponseValidationError as e:
print(f"Response validation failed: {e.message}")from anthropic import (
APIError,
APIConnectionError,
APITimeoutError,
RateLimitError,
)
try:
message = client.messages.create(...)
except APITimeoutError:
print("Request timed out")
except APIConnectionError:
print("Connection failed")
except RateLimitError:
print("Rate limit exceeded")
except APIError as e:
print(f"API error: {e.message}")# Bad
message = client.messages.create(...)
# Good
try:
message = client.messages.create(...)
except APIError as e:
# Handle error
...# Less precise
try:
message = client.messages.create(...)
except Exception:
...
# More precise
try:
message = client.messages.create(...)
except RateLimitError:
# Handle rate limit
...
except APIError:
# Handle other API errors
...import logging
logger = logging.getLogger(__name__)
try:
message = client.messages.create(...)
except APIStatusError as e:
logger.error(
"API request failed",
extra={
"request_id": e.request_id,
"status_code": e.status_code,
"error_message": e.message,
}
)