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
예외를 발생시킨 경우 구조는 해당 예외를 처리하지 않습니다.예외를 지정할 때 구조는 예외 개체의 상속을 고려합니다.
rescue
는 NoMethodError
클래스의 자손인 모든 예외를 처리합니다.컨트롤러까지 전파
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를 읽었습니다. 예외의 힘과 함정을 더 잘 이해하기 위해 그것을 집어 들고 읽어보는 것이 좋습니다.
Reference
이 문제에 관하여(Rails에서 애플리케이션 예외 처리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/devteam/application-exception-handling-in-rails-1pbh텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)