본문 바로가기

Ruby On Rails/예외처리

Controller 예외처리

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