Menu
Coddy logo textTech

ensure와 raise

Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 46번째.

두 가지 요소가 더 추가되어 오류 처리 도구 모음이 완성됩니다.

ensurebegin이 정상적으로 종료되었든, 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하거나, 아니면 상위로 전달되도록 둘 수 있습니다.

challenge icon

챌린지

쉬움

다음을 수행하는 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"
end

raise는 예외를 발생시킵니다. 특정 유형을 발생시키려면 클래스와 메시지를 전달하세요:

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 출력.
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨