FastAPI에서 주로 발생시키는 에러는 HTTPException, Exception이 있다.
프로젝트를 진행함에 따라서 예외 핸들링을 하게 되는데, 이 두 가지 간에 혼용하여 사용할 경우가 있어 이를 바르게 사용하고자 정리해보겠다.
1. HTTPException
HTTPException은 FastAPI에서 HTTP 요청 처리 중에 발생할 수 있는 특정 예외를 처리하기 위해 사용됩니다. 특히나, 주로 클라이언트에게 HTTP 상태 코드와 함께 명확한 오류 메시지를 반환하고자 할 때 사용된다.
주로, 잘못된 요청, 인증 실패, 리소스 없음 등과 같은 HTTP 관련 오류를 명시적으로 나타내기 위해 사용된다.
✔️ HTTPException의 특징
- HTTP 상태 코드
- status_code를 인자로 받아 반환할 HTTP 상태 코드를 지정한다.
- 에러메시지
- detail을 인자로 받아 클라이언트에 전달할 오류 메시지를 포함할 수 있다.
- 헤더 추가 가능
- 필요에 따라 HTTP 응답 헤더를 추가할 수 있다.
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"foo": "The Foo Wrestlers"}
@app.get("/items/{item_id}")
async def read_item(item_id: str):
if item_id not in items:
raise HTTPException(status_code=404, detail="Item not found")
return {"item": items[item_id]}
https://fastapi.tiangolo.com/reference/exceptions/
2. Exception
Exception은 Python에서 기본 예외 클래스이며, 일반적으로 모든 예외의 기반 클래스다. 일반적인 오류와 예외를 처리하기 위해 사용된다.
주로 비 HTTP 관련 오류를 처리하거나, HTTPException을 처리할 수 없는 상황에서 사용된다.
✔️ Exception의 특징
- 포괄적 사용
- Exception은 거의 모든 종류의 예외를 나타내고 처리하는 데 사용된다.
- 구체화 필요
- HTTP 응답과 관련된 상세한 처리를 위해서는 구체적인 예외 클래스를 정의하거나 HTTPException으로 변환해서 처리해야 한다.
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/divide")
async def divide(a: int, b: int):
try:
result = a / b
except ZeroDivisionError:
raise HTTPException(status_code=400, detail="Division by zero is not allowed")
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
return {"result": result}
3. 두 가지의 주요한 차이점
- 의도 및 사용 목적:
- HTTPException: HTTP 응답과 관련된 특정 오류를 처리하여 클라이언트에게 명확한 상태 코드와 메시지를 반환하는 데 사용된다.
- Exception: 일반적인 예외 처리를 위해 사용되며, HTTP 응답과 직접적인 연관이 없다.
- HTTP 관련성:
- HTTPException: HTTP 상태 코드와 관련된 예외로 HTTP 프로토콜에 맞는 응답을 제공하는 데 사용된다.
- Exception: HTTP와 상관없이 일반적인 프로그래밍 오류를 처리하는 데 사용된다.
- 사용 사례:
- HTTPException: 잘못된 요청, 인증 문제, 권한 문제 등과 같이 HTTP 요청과 관련된 예외 상황에 주로 사용된다.
- Exception: 파일 입출력 오류, 데이터베이스 연결 오류, 타입 오류 등 다양한 프로그래밍 오류에 사용된다.
4. 한 줄 요약
HTTPException은 주로 HTTP 요청과 관련된 예외 상황을 처리하고 클라이언트에게 적절한 HTTP 응답을 제공하기 위해 사용되며, Exception은 일반적인 프로그래밍 오류를 포괄적으로 처리하는 데 사용된다.
'Backend > FastAPI' 카테고리의 다른 글
FastAPI PostgreSQL DB 트랜잭션 동기/비동기 처리 (0) | 2024.05.11 |
---|---|
CGI, WSGI, ASGI 에 대하여 (0) | 2024.05.10 |
[Python] FastAPI Logging - correlation ID (middleware & uuid) (1) | 2024.05.03 |
Precommit Test (0) | 2024.03.18 |
AID backend project 추가 정리 (1) | 2024.03.18 |