예외 처리(Exceptions): begin/rescue로 에러 다루기
예외 처리(Exceptions): begin/rescue로 에러 다루기
프로그램을 짜다 보면 "이 코드가 실패할 수도 있겠다" 싶은 곳이 생겨요. Ruby에서는 그런 곳을 begin/end 블록으로 감싸고 rescue로 실패를 잡아요. 이번에는 예외를 잡는 기본 문법과, 어느 범위에서 begin을 생략할 수 있는지 살펴볼게요.
본문
예외는 begin/end 블록 안에서 rescue로 잡아요.
begin
# code that might raise
rescue
# handle exception
end
메서드 안이라면, rescued 된 예외의 범위를 한정하고 싶지 않을 때는 begin/end를 쓰지 않아도 돼요.
def my_method
# ...
rescue
# ...
end
class, module, block도 마찬가지예요. 그래서 블록 안에서도 rescue를 바로 쓸 수 있어요.
[0, 1, 2].map do |i|
10 / i
rescue ZeroDivisionError
nil
end
#=> [nil, 10, 5]
rescue 줄 끝에 => variable_name을 붙이면 해당 예외를 지역 변수에 담을 수 있어요.
begin
# code that might raise
rescue => e
puts "caught: #{e.message}"
end
예외는 특정 클래스를 지정해서 잡을 수도 있어요. 위 예시처럼 rescue ZeroDivisionError라고 쓰면 그 예외만 잡아요. 이 클래스 계층을 이해하려면 Exception 클래스 문서를 함께 보면 좋아요.