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.직접 해보기
# 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 출력.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 및 흐름의 모든 레슨
직접 연습해 보세요: 온라인 Ruby 컴파일러