custom error handler
이번 시간에는 사용자가 에러 처리를 정의하는 custom error handler에 대해 알아보도로 하겠습니다.
프로그램 실행시 에러가 발생하면 그 상황에 대해 적절한 처리가 필요합니다.
API의 에러 응답(error response)을 정의할 수 있는 Custom exception handler에 대해 설명하려고 합니다.
Flask에서는 데코레이터를 통해 error handling이 가능합니다.
이 포스팅에서는 Flask로 구현해보도록 하겠습니다.
def error_handler(app):
@app.errorhandler(500)
def data_error(e):
log_error_message = e
return error_response("500 에러 발생", log_error_message, 500)
def error_response(error_message, log_error_message, status_code):
"""
:param error_message: 사용자 에러 메시지
:param log_error_message: 로그 기록용 에러 메시지
:param status_code: 상태 코드
:return:
"""
result = {
'code': status_code,
'message': error_message
}
logs.error(log_error_message)
return json.dumps(result, ensure_ascii=False)
500 에러가 발생 했을 때 에러 처리를 하는 함수입니다.
에러 내용을 로그에 기록하고 에러 응답하는 error_response 함수를 return하도록 했습니다.
에러를 응답하는 error_response 함수에서는 API의 에러 응답을 정의하도록 하였습니다.
from flask import abort
@app.route('/', methods=['GET'])
def index():
abort(500) # 에러를 발생시키는 abort함수
다음과 같이 500 에러를 발생 시킬 경우 정의한대로 응답하는 것을 확인 할 수 있습니다.
이번에는 지난 시간에 포스팅 했던 flask request validator를 이용해 유효성 검사를 통과하지 못한 값이 들어왔을 경우 에러를 정의해보도록 하겠습니다.
flask request validator로 파라미터 유효성 검사하기
@app.errorhandler(RequestError)
def data_error(e):
"""
validate_params 에러
- null값 체크, rule(정규식, MaxLength 등) 검사
"""
log_error_message = request_validation_error(e) # 어떤 유효성에 어긋나는지 확인하는 함수 정의함
return error_response(error_message, log_error_message, 10)
@img.route('/', methods=['GET'])
@validate_params(
Param('id', JSON, str, required=True),
Param('ip', JSON, str, rules=[Pattern(r'(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9]['
r'0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$')], required=True),
)
def index(valid: ValidRequest):
info = valid.get_json()
id에 아무것도 입력하지 않았을 경우, ip를 정규식에 맞지 않는 값을 입력해 요청한 결과 다음과 같이 정의한대로 응답하는 것을 확인할 수 있었습니다.
이번 시간에는 사용자가 에러 처리를 정의하는 custom error handler에 대해 알아보았습니다.
custom error handler를 이용하면 원하는대로 response 할 수 있고, 전체적인 에러 관리를 한 곳에서 모여 처리할 수 있다는 장점이 있는 것 같습니다.