Ruby는 begin/rescue/(Ruby의 try/catch/finally에 해당)로 에러를 처리합니다. 예외를 하고 하며, 정리를 위해 를 사용합니다. Ruby는 또한 더 깔끔한 코드를 위해 (명시적 없이) 메서드 수준 rescue를 허용합니다.
ensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # 특정 예외 타입을 rescue
puts "Bad argument: #{e.message}"
rescue StandardError => e # 더 넓은 포착 (Exception이 아닌 StandardError)
puts "Error: #{e.message}"
retry if attempts < 3 # retry는 begin 블록을 다시 실행 가능
else
puts "succeeded" # 예외가 없으면 실행됨
ensure
cleanup # 항상 실행됨 (성공이든 실패든)
end
begin/rescue/ensure는 Ruby의 try/catch/finally입니다. 특정 타입을 rescue(rescue ArgumentError)하고, 보장된 정리를 위해 ensure를, 무에러 경우를 위해 else를 사용합니다. retry는 블록을 재시도할 수 있습니다.
rescue => e # ✅ 빈 rescue는 StandardError를 포착 (올바른 기본값)
rescue StandardError # ✅ 명시적, 동일한 것
rescue Exception # ❌ 피하세요 — 시스템 시그널 포함 모든 것을 포착
# (Interrupt/Ctrl-C, SystemExit) — 프로그램을 망가뜨릴 수 있음
중요: 빈 rescue는 StandardError(애플리케이션 에러에 대한 올바른 기본값)를 포착합니다. Exception(최상위)을 rescue하면 모든 것을 포착합니다 — Interrupt(Ctrl-C)와 SystemExit 같은 시스템 수준 시그널을 포함하여 — 이는 보통 원치 않는 것으로, 프로그램이 중단되거나 제대로 종료되는 것을 막을 수 있습니다. 흔한 Ruby 실수입니다.
raise ArgumentError, "Amount must be positive" # 내장 예외 발생
raise "Something failed" # RuntimeError 발생
# 커스텀 예외 클래스
class InsufficientFundsError < StandardError # StandardError로부터 상속
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # begin 없는 rescue — 메서드 본문 전체에 적용
handle(e)
ensure
cleanup
end
적절한 예외 처리는 견고한 Ruby 애플리케이션에 필수적이며, Ruby의 접근법 — 그 구체적인 관용구와 주의점을 포함하여 — 을 이해하는 것은 중요합니다.
begin/rescue/ensure 구조(Ruby의 try/catch/finally), 특정 예외 타입을 rescue하는 것, 보장된 정리를 위해 ensure를 사용하는 것, 그리고 깔끔한 메서드 수준 rescue(명시적 begin 없이)는 기본적인 일상 지식입니다.
특히 중요하고 Ruby에 특화된 점은 StandardError 대 Exception 구분입니다: 빈 rescue(그리고 올바른 기본값)는 StandardError를 포착하지만, Exception(계층의 최상위)을 rescue하면 모든 것을 포착합니다 — Interrupt(Ctrl-C)와 SystemExit 같은 시스템 시그널을 포함하여 — 이는 거의 항상 원치 않는 것으로, 프로그램이 중단되거나 제대로 종료되는 것을 막을 수 있으며, 흔하고 해로운 실수입니다.
애플리케이션 에러에 대해 Exception이 아닌 StandardError를 rescue해야 한다는 것을 이해하는 것은 실제 버그를 방지하는 중요한 Ruby 특화 지식입니다.
구조, 커스텀 예외 클래스(StandardError로부터 상속), retry, 메서드 수준 rescue 관용구, 그리고 특히 Exception이 아닌 StandardError 주의점을 아는 것은 프로그램의 중단 가능성을 망가뜨리지 않으면서 에러를 우아하게 처리하는 견고하고 올바른 Ruby를 작성하는 데 중요합니다.
처리되지 않은 에러와 Exception을 rescue하는 실수 모두 실제 문제를 일으키므로, Ruby의 예외 처리 — 그 구조, 관용구, 그리고 결정적인 StandardError 대 Exception 구분 — 을 숙달하는 것은 신뢰할 수 있는 Ruby 개발에 중요하고 자주 관련되는 지식이자 흔한 면접 주제입니다.