1. raise, rescue 처리
- 잘못된 값이 들어왔을 때, raise로 예외를 하나하나 처리해주고 그 메시지를 rescue로 넘겨줘서 처리하는 방식이다.
def delete_cash
id = params[:id].to_i
raise ApiExceptions::CustomException.new(:not_found, I18n.t('common.messages.cash.not_found')) if id.blank?
CashTable.destroy(id)
rescue => e
render_error e.class == ApiExceptions::CustomException ? e.status : :not_acceptable, e.class == ApiExceptions::CustomException ? e.resultMsg : e.message
end
- 특정 컨트롤러에서 delete_cash 를 처리한다고 가정해보자.
- 이때, raise로 에러 발생 시 특정 메시지를 화면에 보여줄 수 있다.
- 물론 서버에서 예상하지 못한 에러가 발생해도 에러 메시지를 보여줄 수 있다.
- 단 커스텀 메세지가 아니라 디폴트 메시지를 보여준다.
- 여기서 CustomException 클래스와 render_error 함수를 직접 정의하여 사용하였는데, 그 이유는 에러를 편하게 처리하기 위함이다.
- 위에서 e로 받은 내용에서 커스텀 에러로 넘어온 것은 직접 정의한 상태 코드와 메시지를 넘겨주고, 그것이 아닌 경우에는 디폴트로 정의된 값을 넘겨주게끔 처리하였다.
class Controller < Base
def render_error(status, message, data = nil)
message = message.full_messages.first if message.respond_to?('full_messages')
response = {
result: 'fail',
code: -1,
alertType: 1,
resultMsg: message
}
response = response.merge(data) if data
render json: {meta: response}, status: status
end
end
- 이렇게 render_error에 대한 내용을 정의해두면 에러 메세지를 처리할 때, 내가 보여주고 싶은 데이터와 메시지, 상태 값 등을 넘겨줄 수 있다.
module ApiExceptions
class CustomException < StandardError
attr_reader :status, :code, :result, :alertType, :resultMsg
def initialize(status, msg)
@status = status
@code = -1
@result = 'fail'
@alertType = 1
@resultMsg = msg
end
end
end
- 에러 메세지 상태 값 코드 등을 하나의 클래스로 넘겨줘서 편하게 처리할 수 있게끔 정의하여 사용하였다.
2. begin, rescue 처리
- 예외가 발생할거같은 부분에 begin/end 블록으로 감싸고, 예외의 타입들을 rescue 절에 지정하여 처리하는 방식이다.
- 물론 이 비긴 안에서도 raise를 사용할 수 있다.
- 비긴을 사용하지 않아도 raise, rescue로 대부분의 에러 처리를 편하고 잘할 수 있다.
- begin을 쓰는 이유는 여러 rescue를 사용하고 싶을 때, 사용하면 좋다.
def destroy
begin
management = Management.find(params[:id])
rescue Exception => e
render status: 406, json: {result: 'fail', message: e.message}
end
begin
management.update!(status: "Deleted")
render status: 200, json: {result: 'success'}
rescue Exception => e
render status: 406, json: {result: 'fail', message: e.message}
end
end
'Ruby On Rails > 예외처리' 카테고리의 다른 글
| 문자열 예외처리 (0) | 2021.11.10 |
|---|