begin / rescue
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 44번째.
예외로 인해 프로그램이 중단되는 것을 방지하려면, 위험한 코드를 begin ... rescue ... end로 감싸세요. begin 내부에서 예외가 발생하면, 루비는 프로그램을 중단하는 대신 해당되는 rescue 블록으로 이동합니다.
begin
result = 10 / 0
puts result
rescue ZeroDivisionError
puts "Cannot divide by zero!"
end
# 0으로 나눌 수 없습니다!=> e를 사용하여 예외 객체 자체를 가져오고 .message를 읽을 수 있습니다:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
end
# Bad input: invalid value for Integer(): "hello"예외 클래스를 지정하지 않으면, rescue는 단독으로 StandardError와 그 하위 클래스들, 즉 대부분의 일상적인 오류들을 잡아냅니다. 오류를 잡는 것은 rescue 블록에서 무언가를 할 수 있을 때 가장 유용합니다: 기본값으로 대체하거나, 문제를 기록하거나, 사용자에게 다시 요청하는 등의 작업을 할 수 있습니다.
챌린지
쉬움입력에서 두 줄을 읽으세요. 두 줄 모두 정수여야 하지만, 두 번째 줄은 유효한 숫자가 아닐 수도 있습니다.
두 번째 줄의 파싱을 begin / rescue로 감싸세요:
Integer(input)을 사용하세요 (잘못된 문자열에 대해ArgumentError를 발생시킵니다)- 파싱에 성공하면,
Sum: <a + b>를 출력하세요 - 실패하면,
Bad number!를 출력하세요
입력이 3 다음에 4인 경우, 출력은 Sum: 7입니다. 3 다음에 abc인 경우, 출력은 Bad number!입니다.
치트 시트
begin ... rescue ... end를 사용하여 프로그램 중단 없이 예외를 처리합니다:
begin
result = 10 / 0
rescue ZeroDivisionError
puts "Cannot divide by zero!"
end=> e를 사용하여 예외 객체를 캡처하고 메시지에 접근합니다:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
end클래스 없이 rescue를 사용하면 StandardError와 그 하위 클래스들을 캡처합니다.
직접 해보기
a = gets.to_i
raw_b = gets.chomp
# TODO: Integer(raw_b)를 begin/rescue로 감싸기; 합계 또는 "Bad number!"를 출력하기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.