Cum să gestionezi erorile într-un API Python — Status Codes și Error Responses
In this tutorial, you'll learn about Cum să gestionezi erorile într. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.
Gestionarea corectă a erorilor într-un API înseamnă returnarea codurilor HTTP potrivite și a unor mesaje de eroare clare și consistente. În acest ghid vei învăța cum să implementezi un sistem robust de error handling.
Problema
Când o cerere eșuează, API-ul tău returnează erori generice, fără coduri HTTP corespunzătoare. Clientul nu poate distinge între o resursă lipsă, date invalide sau o eroare de server.
Soluția Rapidă
1. Coduri HTTP esențiale
| Cod | Când se folosește |
|---|---|
| 200 | Succes |
| 201 | Resursă creată |
| 204 | Șters cu succes, fără conținut |
| 400 | Request invalid (date greșite, JSON malformat) |
| 401 | Neautentificat |
| 403 | Neautorizat (autentificat dar fără permisiuni) |
| 404 | Resursa nu există |
| 409 | Conflict (ex: duplicat) |
| 422 | Validare eșuată |
| 429 | Rate limit atins |
| 500 | Eroare internă de server |
2. Error handling în FastAPI
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from fastapi.exceptions import RequestValidationError
app = FastAPI()
# Eroare standard
@app.get("/utilizatori/{id}")
def utilizator(id: int):
if id <= 0:
raise HTTPException(
status_code=400,
detail="ID-ul trebuie sa fie pozitiv"
)
return {"id": id, "nume": "John"}
# Handler global pentru validare
@app.exception_handler(RequestValidationError)
async def validare_error(request, exc):
return JSONResponse(
status_code=422,
content={
"eroare": "Date invalide",
"detalii": exc.errors(),
"cod": "VALIDATION_ERROR"
}
)
3. Structură consistentă de eroare
class APIError(BaseModel):
eroare: str
cod: str
detalii: str | None = None
timestamp: str
@app.get("/produse/{id}")
def produs(id: int):
if id <= 0:
return JSONResponse(
status_code=400,
content={
"eroare": "ID invalid",
"cod": "INVALID_ID",
"detalii": "ID-ul produsului trebuie sa fie un numar pozitiv",
"timestamp": "2025-01-15T12:00:00Z"
}
)
4. Error handling în Flask
from flask import Flask, jsonify
app = Flask(__name__)
class APIError(Exception):
def __init__(self, mesaj, cod, status_code=400):
self.mesaj = mesaj
self.cod = cod
self.status_code = status_code
@app.errorhandler(APIError)
def handle_api_error(error):
return jsonify({
"eroare": error.mesaj,
"cod": error.cod
}), error.status_code
@app.errorhandler(404)
def not_found(error):
return jsonify({
"eroare": "Resursa nu a fost gasita",
"cod": "NOT_FOUND"
}), 404
5. Logarea erorilor
import logging
logger = logging.getLogger(__name__)
@app.exception_handler(Exception)
async def eroare_generala(request, exc):
logger.error(f"Eroare pe {request.url}: {exc}")
return JSONResponse(
status_code=500,
content={"eroare": "Eroare interna de server"}
)
Prevenție
- Creează o clasă de erori personalizată pentru API-ul tău
- Nu expune stack trace-urile sau detaliile interne în producție
- Loghează toate erorile cu context (URL, parametri, user ID)
- Include un cod de eroare unic pentru fiecare tip de problemă
- Documentează toate codurile de eroare în Swagger/OpenAPI
Greșeli Comune
- Returnarea 500 pentru orice eroare -- ascunde cauza reală și îngreunează depanarea
- Expunerea stack trace-ului -- risc major de securitate, dezvăluie structura internă a aplicației
- Mesaje de eroare inconsitente -- uneori text, alteori JSON, alteori HTML
- Ignorarea erorilor de validare Pydantic -- FastAPI le returnează implicit, dar poți personaliza formatul
- Lipsa logării erorilor 500 -- fără loguri nu poți investiga cauza problemelor de producție
Exercițiu Practic
Implementează un API cu un handler global de erori care returnează o structură JSON consistentă {eroare, cod, detalii, timestamp} pentru 400, 404, 422 și 500.
FAQ
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro