예외 처리용 구문: rescue, ensure
★프로그래밍/Ruby :: 2016. 8. 19. 16:44루비 프로그램에서 오류가 발생할 경우를 대비하여 예외처리를 하기 위한 구문으로는 rescue와 ensure가 있습니다.
여기서 오류라 함은 구조적으로는 문제가 없으나 상황에 따라 발생할 수 있는 오류(예를 들자면, 처리하려던 파일이 갑자기 없어졌다거나...)를 말하는 것으로, 구문 오류와 같이 구조적으로 문제가 있는 경우는 이에 해당하지 않습니다.
일단 다음 코드를 봅시다.
10.downto(0) do |x| puts 240 / x end
이 코드를 실행하면, 제수가 될 x의 값이 0까지 감소하기 때문에 반복처리로 x의 값이 0까지 내려가는 순간 2번 줄은 240÷0이 되어버려 오류를 일으키게 됩니다.
이 코드를 다음과 같이 바꿔 봅시다.
10.downto(0) do |x| begin puts 240 / x rescue puts "맙소사!" end end
이 코드의 실행 결과는 과연 어떻게 될까요?
24 26 30 34 40 48 60 80 120 240 맙소사!
이렇습니다.
예외 처리를 할 부분은 begin - end 블록으로 묶어두고 그 블록 안에서 begin - rescue 사이의 코드(여기서는 3번 줄)만 실행하다가, 오류를 일으키게 될 상황이 오면 rescue 다음의 코드(여기서는 5번 줄)로 넘어가 예외 처리를 수행하게 됩니다.
여기서는 240을 10부터 1까지 나눴을 때는 제대로 나눗셈이 수행되지만, 0이 되는 순간 오류가 일어나므로 rescue 다음으로 넘어가 "맙소사"라는 메시지를 출력하는 예외 처리를 수행하게 되는 것입니다.
여기서 살을 더 붙여 봅시다.
10.downto(0) do |x| begin print 240 / x rescue print "맙소사!" ensure puts " ... ok" end end
rescue와 end 사이에 또 ensure가 추가되었습니다. 이 코드의 실행 결과는 과연 어떻게 될까요?
24 ... ok 26 ... ok 30 ... ok 34 ... ok 40 ... ok 48 ... ok 60 ... ok 80 ... ok 120 ... ok 240 ... ok 맙소사! ... ok
이렇습니다.
ensure - end 구간은 블록 안에서 예외 처리의 수행 여부에 관계없이 수행될 코드가 들어갑니다. 예외 처리가 수행되지 않은 경우 rescue 혹은 ensure 문 직전의 코드까지, 예외 처리가 수행된 경우 예외 처리가 종료된 후 수행됩니다.
여기서는 x가 1까지 됐을 땐 일단 240÷x 출력 후 "ok"라는 단어를 띄우고, x가 0일 때는 240÷0의 예외 처리로 "맙소사"라는 메시지를 출력 후 x >= 1 상황과 마찬가지로 "ok" 단어를 띄웁니다.
ensure 문은 예외 처리 수행 이후의 코드를 중복으로 쓰는 문제를 해결하기 위한 코드로, 필요하면 rescue와 함께 쓸 수도 있습니다.
다만, 주의할 점이라면 하나의 begin - end 블록 안에서 rescue와 ensure 문을 동시에 사용하려면 rescue가 ensure보다 먼저 와야 합니다는 점입니다.
많은 도움 되셨나요?
유용한 정보로 활용하시기 바랍니다.