Skip to content

Cum să gestionezi erorile într-un API Python — Status Codes și Error Responses

DodaTech Updated 2025-01-15 3 min read

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

  1. Returnarea 500 pentru orice eroare -- ascunde cauza reală și îngreunează depanarea
  2. Expunerea stack trace-ului -- risc major de securitate, dezvăluie structura internă a aplicației
  3. Mesaje de eroare inconsitente -- uneori text, alteori JSON, alteori HTML
  4. Ignorarea erorilor de validare Pydantic -- FastAPI le returnează implicit, dar poți personaliza formatul
  5. 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

### Care este diferența între 400 și 422?

400 Bad Request înseamnă că request-ul este malformat (JSON invalid). 422 Unprocessable Entity înseamnă că request-ul este valid sintactic dar datele nu trec validarea de business.

Ar trebui să includ stack trace-ul în răspunsul de eroare?

Nu în producție. Stack trace-ul dezvăluie structura internă a aplicației. Loghează-l intern și returnează doar un cod de eroare și un mesaj generic.

Cum structurez mesajele de eroare?

Folosește un format JSON consistent cu câmpurile: eroare (mesaj pentru utilizator), cod (cod unic intern) și opțional detalii (informații suplimentare pentru debug).

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro