Rails에서 애플리케이션 예외 처리

(일부) 전파 계층에 대한 빠른 둘러보기



당사Forem code base에는 세 가지 기본 예외 처리 전략이 있습니다.
  • 인라인
  • 컨트롤러까지 전파
  • 응용 프로그램까지 전파

  • 이러한 각 전략은 유효하며 메서드에서 컨트롤러, 애플리케이션으로 전파됩니다.

    대처 전략



    인라인



    다음은 모든 예외를 로그에 기록하여 처리하는 함수의 예입니다. do_something의 일부에서 예외가 발생하면 이를 캡처하여 로그에 기록합니다.

    또한 호출된 항목my_function은 계속 처리됩니다.

    def my_function
      do_something
    rescue => e
      logger.error(e)
    end
    
    


    또 다른 변형은 특정 예외를 캡처하는 것입니다.

    def my_function
      do_something
    rescue NoMethodError => e
      logger.error(e)
    end
    
    


    위의 예에서 코드는 예외NoMethodError만 처리합니다. do_something 메서드가 RuntimeError 예외를 발생시킨 경우 구조는 해당 예외를 처리하지 않습니다.

    예외를 지정할 때 구조는 예외 개체의 상속을 고려합니다. rescueNoMethodError 클래스의 자손인 모든 예외를 처리합니다.

    컨트롤러까지 전파



    Rails에서는 컨트롤러 수준에서 핸들 예외를 추가할 수 있습니다. 표시될 수 있는 코드는 다음과 같습니다.

    class UsersController
      rescue_from ActiveRecord::NotFoundError, with: :not_found
    
      def show
        @user = User.find(params[:id])
      end
    
      private
    
      def not_found
        render "404.html", status: 404
      end
    end
    
    


    자세한 내용은 rescue_from method documentation을 참조하십시오. 특히 문서의 마지막 줄은 "예외 처리기 내에서 발생한 예외는 전파되지 않습니다."입니다.

    즉, rescue_from 를 사용하고 개발 중인 항목을 보면 브라우저에 예외가 표시되지 않습니다.

    애플리케이션 처리까지 전파



    인라인도 사용하지 않는 경우rescue_from 예외가 응용 프로그램에 표시됩니다. 그리고 구성이 없으면 사이트를 방문하는 사람들은 기본 Rails 예외 페이지를 보게 됩니다.

    응용 프로그램 수준에서 예외를 처리하려면 응용 프로그램의 다음 항목에 예외를 추가합니다./config/application.rb.

    아래 예제에서 모든 "Pundit::NotAuthorizedError"예외는 요청을 처리한 컨트롤러에서 not_found 메서드를 호출합니다.

    config.action_dispatch.rescue_responses["Pundit::NotAuthorizedError"] = :not_found
    
    


    이것이 구성의 첫 번째 부분입니다. 두 번째 부분은 구성에 다른 부분을 추가하는 것입니다. config.consider_all_requests_local를 설정하고 싶습니다.
    ./config/environments/production.rb에서 다음을 자주 볼 수 있습니다.

    config.consider_all_requests_local = false
    
    


    이는 config.action_dispatch.rescue_responses를 보고 해당 메서드를 호출하도록 Rails를 구성하고 있음을 의미합니다. 즉, 프로덕션 사용자에게 못생긴 예외를 표시하지 마십시오. 500 오류 페이지를 표시하도록 하는 다른 구성이 있지만 이 게시물의 범위를 벗어납니다.

    그러나 개발 환경(예: ./config/environments/development.rb )에서 해당 값은 종종 true로 설정됩니다. 즉, 우리는 Rails에게 config.action_dispatch.rescue_responses를 무시하도록 지시하고 있으며 종종 유용하긴 하지만 보기 흉한 예외를 브라우저에 렌더링합니다.

    결론



    어느 것을 언제 사용합니까? 조건에 따라서. 예외가 발생한 위치에서 멀어질수록 더 많은 것을 고려해야 합니다.

    첫째, 인라인 구조를 할 수 있다면 좋습니다. 하지만 모든 ActiveRecord::RecordNotFound 예외를 인라인 구조하지 않습니까?

    내가 선호하는 것은 rescue_from 의 사용을 최소화하는 것입니다. 그것은 "항상 켜짐"입니다. 이는 호출 스택을 숨기는 것을 의미합니다. 내 개발 작업에서 유용하다고 생각하는 것.

    얼마 전에 Avdi Grimm의 Exceptional Ruby를 읽었습니다. 예외의 힘과 함정을 더 잘 이해하기 위해 그것을 집어 들고 읽어보는 것이 좋습니다.

    좋은 웹페이지 즐겨찾기