질문 : 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
구하는 것이 좋습니다.
Exception
은 Ruby의 예외 계층 구조의 루트이므로 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
'개발관련 > other' 카테고리의 다른 글
Node.js 프로그램에 명령 줄 인수를 전달하는 방법 (0) | 2021.06.08 |
---|---|
Twitter 부트 스트랩 양식 파일 요소 업로드 버튼 (0) | 2021.06.07 |
ViewPager에서 조각이 표시되는시기를 확인하는 방법 (0) | 2021.06.05 |
Chrome 개발자 도구의 위치를 변경하는 방법 (0) | 2021.06.04 |
팩토리와 추상 팩토리 디자인 패턴의 기본적인 차이점 (0) | 2021.06.04 |