Ruby 예외 처리의 핵심: begin-rescue-else-ensure
Ruby는 ‘try-catch’ 대신 begin, rescue, else, ensure 블록을 사용합니다.
-
begin: 예외 발생 가능 코드를 감쌉니다. -
rescue: 발생한 예외를 포착 및 처리하며, 특정 예외 유형 지정 및 예외 객체(=> e) 접근이 가능합니다. -
else:begin에서 예외가 없을 때만 실행되어 성공 로직을 분리합니다. -
ensure: 예외 발생 여부와 관계없이 항상 실행되며, 리소스(파일, DB 연결 등) 정리 작업에 필수적입니다.
예외 계층, 모범 사례 및 고급 기능
모든 Ruby 예외는 Exception을 상속하며, 주로 StandardError 하위 클래스를 처리합니다. ZeroDivisionError와 같은 구체적인 예외를 명시적으로 처리하고 Logger 등으로 상세 로깅하는 것이 중요합니다. Exception 직접 rescue는 치명적인 문제를 가릴 수 있어 피해야 합니다. StandardError를 상속받아 사용자 정의 예외를 생성하여 도메인 오류를 명확히 표현할 수 있으며, raise로 직접 예외를 발생시키고 retry로 begin 블록 코드를 재시도할 수 있습니다(시도 횟수 제한 필수).
실제 적용 및 주의사항
Rails에서는 rescue_from으로 애플리케이션 전반의 예외를 중앙에서 처리하며, 외부 API 호출 시 네트워크 및 데이터 파싱 예외를 처리하여 서비스 안정성을 높입니다. ensure 누락은 리소스 누수를 야기하며, 예외 처리는 조건문보다 느리므로 빈번한 유효성 검사에는 if 문이 효율적입니다.