[WAFFLE] 01-7 Error Handling
Published:
In this post, concepts about Error Handling is introduced.
Error Handling
서버에서 오류가 발생하는 원인은 Client Error(클리이언트의 잘못된 요청, 4xx 응답코드 사용)와 Server Error(서버의 잘못된 처리, 5xx 응답코드 사용)로 나뉜다. 서버 오류는 일시적인 오류일 수도, 영구적인 오류일 수도 있음. 일시적인 오류라면 Retry-After 헤더를 통해 재시도를 권장할 수 있음. 서버 오류의 예로 503 에러는 서버가 과부화 상태일 때 발생한다. 앞 단의 웹 서버에서 우리 application 서버에 요청하는데 잘 안될 때, NginX 503 에러가 뜬다.
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/items/{item_id}")
def read_item(item_id: int):
if item_id == 0:
raise HTTPException(status_code=404, detail="Item not found")
return {"item_id": item_id}
- HTTPException을 이용해서 명시적으로 에러를 발생시킬 수 있다. FastAPI가 알아서 정제해서 클리이언트에게 정보 전달해줌.
- 직접 Response로 반환하지 않는 이유는 raise 문법으로 직접 에러를 던져야 FastAPI에 내장되어 있는 에러 핸들러 함수가 작동하기 때문.
만약 FastAPI에 내장되어 있는 에러 핸들러로는 기능이 부족하다면 커스텀 에러 핸들러를 만들 수 있다. exception_handler라는 데코레이터 팩토리를 이용해서 예외 핸들러를 정의해주면 된다. 특정 에러는 이 핸들러를 사용하겠다, 혹은 특정 상태코드에 대해서 이 에러 핸들러를 사용하겠다 정의해줄 수 있다.
@app.exception_handler(MyException)
async def http_exception_handler(request: Request, exc: MyException):
return JSONResponse(
status_code=500,
content={"detail": exc.detail},
)
- 해당 데코레이터 팩토리에는 하나의 예외 타입만 지정할 수 있으므로, 여러 개의 예외를 처리하려면
- 여러 예외 핸들러를 등록하거나
- 부모 클래스로 묶어서 처리해야 함

Leave a Comment