개발관련/other

Ruby에서`rescue Exception => e`를 사용하면 안되는 이유

Rateye 2021. 6. 3. 11:37
728x90
반응형
질문 : Ruby에서`rescue Exception => e`가 왜 나쁜 스타일입니까?

Ryan Davis의 Ruby QuickRef 는 다음과 같이 말합니다 (설명없이).

Don’t rescue Exception. EVER. or I will stab you.

Don’t rescue Exception. EVER. or I will stab you.

왜 안돼? 옳은 일은 무엇입니까?

답변

TL; DR : 일반 예외 포착 대신 StandardError 원래 예외가 다시 발생하면 (예 : 예외를 기록하기 위해 구출하는 경우에만) Exception 구하는 것이 좋습니다.

ExceptionRuby의 예외 계층 구조의 루트이므로 rescue Exception SyntaxError , LoadError , Interrupt 와 같은 하위 클래스를 포함한 모든 것을 구할 수 있습니다.

Rescuing Interrupt 는 사용자가

CTRL + C

를 사용하여 프로그램을 종료하지 못하도록합니다.

SignalException 구하면 프로그램이 신호에 올바르게 응답하지 못합니다. kill -9 제외하고는 죽일 수 없습니다.

Rescuing eval 이 자동으로 SyntaxError 의미합니다.

이 모든 것은이 프로그램을 실행하고

CTRL + C 를

시도하거나 kill 것으로 표시 될 수 있습니다.

loop do
  begin
    sleep 1
    eval "djsakru3924r9eiuorwju3498 += 5u84fior8u8t4ruyf8ihiure"
  rescue Exception
    puts "I refuse to fail or be stopped!"
  end
end

Exception 에서 구조하는 것은 기본값이 아닙니다. 하기

begin
  # iceberg!
rescue
  # lifeboats
end

Exception 에서 구조하지 않고 StandardError 에서 구조합니다. StandardError 보다 더 구체적인 것을 지정해야하지만 Exception 구하면 범위를 좁히기보다는 범위가 넓혀지고 치명적인 결과를 낳고 버그 찾기가 매우 어려워 질 수 있습니다.

StandardError 에서 구출하고 싶은 상황이 있고 예외가있는 변수가 필요한 경우 다음 형식을 사용할 수 있습니다.

begin
  # iceberg!
rescue => e
  # lifeboats
end

다음과 동일합니다.

begin
  # iceberg!
rescue StandardError => e
  # lifeboats
end

Exception 로부터 구조하는 것이 정상인 몇 가지 일반적인 경우 중 하나는 로깅 /보고 목적이며,이 경우 예외를 즉시 다시 발생시켜야합니다.

begin
  # iceberg?
rescue Exception => e
  # do some logging
  raise # not enough lifeboats ;)
end
출처 : https://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby
728x90
반응형