ensure와 raise
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 46번째.
두 가지 요소가 더 추가되어 오류 처리 도구 모음이 완성됩니다.
ensure는 begin이 정상적으로 종료되었든, rescue 분기에서 예외를 포착했든, 혹은 예외가 포착되지 않았더라도 어떤 상황에서도 실행되는 블록입니다. 이곳은 정리 코드를 작성하는 곳입니다:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# 파일 여는 중
# 예외를 잡음
# 파일 닫는 중raise는 자신만의 예외를 생성하는 방법입니다. 메시지로 문자열을 전달하거나, 클래스와 메시지를 함께 전달하세요:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... 출금을 수행합니다
end관례는 인수가 잘못되었을 때 빠르게 실패하도록 메서드 상단에서 일찍 raise하는 것입니다. 호출자는 합리적인 복구 방법이 있다면 rescue하거나, 아니면 상위로 전달되도록 둘 수 있습니다.
챌린지
쉬움다음을 수행하는 safe_divide(a, b) 메서드를 정의하세요:
b == 0인 경우"b cannot be zero"라는 메시지와 함께ArgumentError를 발생시킵니다.- 그렇지 않으면
a / b를 반환합니다.
그런 다음 입력에서 두 개의 정수를 읽습니다. begin / rescue / ensure 내에서 safe_divide를 호출하세요:
- 성공 시,
Result: <value>를 출력합니다. ArgumentError발생 시,Error: <message>를 출력합니다.ensure에서는 항상Done.을 출력합니다.
입력이 10 / 2인 경우, 출력은 다음과 같습니다:
Result: 5
Done.입력이 10 / 0인 경우:
Error: b cannot be zero
Done.치트 시트
ensure는 어떤 상황에서도(정상 종료, rescue됨, 또는 포착되지 않은 예외) 실행됩니다 — 정리 작업에 사용하세요:
begin
raise "something broke"
rescue
puts "caught it"
ensure
puts "always runs"
endraise는 예외를 발생시킵니다. 특정 유형을 발생시키려면 클래스와 메시지를 전달하세요:
raise ArgumentError, "amount must be positive" if amount <= 0관례: 잘못된 인수에 대해 빠르게 실패하도록 메서드 상단에서 일찍 raise를 수행합니다.
직접 해보기
# TODO: safe_divide(a, b) 정의, b == 0일 때 ArgumentError 발생
a = gets.to_i
b = gets.to_i
# TODO: begin ... Result 출력; rescue ArgumentError => e ... Error 출력; ensure ... Done 출력.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.