학습
Ruby 예외 처리 기본
Ruby 예외 처리 기본 — 초급
Ruby 예외 처리 기본
1. 도입 (왜 배워야 하는가)
프로그래밍에서는 예상치 못한 오류가 발생하는 경우가 많습니다. 예를 들어, 사용자가 잘못된 데이터를 입력하거나 네트워크 연결이 끊어지는 경우 등이 있습니다. 이러한 상황에서 적절한 오류 처리를 하지 않으면 프로그램이 중단되거나 비정상적으로 작동할 수 있습니다. 예외 처리를 통해 프로그램의 안정성을 높이고, 사용자에게 친절한 오류 메시지를 제공하여 경험을 개선할 수 있습니다.
예외 처리를 배우지 않으면 다음과 같은 문제가 발생할 수 있습니다:
- 프로그램이 예기치 않게 종료됨
- 사용자에게 혼란을 주는 비정상적인 오류 메시지 발생
- 코드 유지보수가 어려워짐
- begin: 예외가 발생할 수 있는 코드를 포함하는 블록입니다.
- rescue: 예외가 발생했을 때 실행할 코드를 정의합니다.
- ensure: 예외 발생 여부에 관계없이 항상 실행될 코드를 포함합니다.
- raise: 강제로 예외를 발생시킵니다.
2. 핵심 개념 설명
예외 처리란 프로그램 실행 중 오류가 발생했을 때 이를 잡아내고 적절히 처리하는 방법입니다. Ruby에서는 begin, rescue, ensure, raise 등의 키워드를 사용하여 예외 처리를 구현합니다.
비유하자면, 예외 처리는 자동차의 에어백과 같습니다. 사고가 발생했을 때 에어백이 작동하여 승객을 보호하는 것처럼, 예외 처리는 프로그램에서 오류가 발생했을 때 적절히 대응하여 프로그램을 보호합니다.
| 용어 | 설명 |
|---|---|
| begin | 예외가 발생할 수 있는 코드 블록 |
| rescue | 예외 발생 시 실행할 코드 블록 |
| ensure | 항상 실행되는 코드 블록 |
| raise | 예외를 강제로 발생시키는 메서드 |
3. 기본 코드 예제
다음은 Ruby에서 예외 처리를 사용하는 가장 기본적인 예제입니다.
begin
puts "숫자를 입력하세요:"
number = Integer(gets.chomp) # 사용자 입력을 정수로 변환
puts "입력한 숫자는 #{number}입니다."
rescue ArgumentError # 입력이 정수가 아닐 경우의 예외 처리
puts "잘못된 입력입니다. 정수를 입력해 주세요."
ensure
puts "프로그램을 종료합니다."
end
실행 결과:
숫자를 입력하세요:
abc
잘못된 입력입니다. 정수를 입력해 주세요.
프로그램을 종료합니다.
코드 설명
begin: 예외 처리를 시작합니다.puts: 사용자에게 숫자를 입력하라는 메시지를 출력합니다.number = Integer(gets.chomp): 사용자의 입력을 정수로 변환합니다. 이때 문자열이 정수가 아닐 경우ArgumentError가 발생합니다.rescue ArgumentError: 만약ArgumentError가 발생하면 이 블록이 실행되어 오류 메시지를 출력합니다.ensure: 이 블록은 예외 발생 여부와 상관없이 항상 실행되며, 프로그램 종료 메시지를 출력합니다.- 예외를 잡지 않기: 예외 처리를 사용하지 않으면 프로그램이 중단됩니다.
- rescue 블록을 너무 구체적으로 작성하지 않기: 특정 예외만 처리하면 다른 오류를 놓칠 수 있습니다.
- 예외 처리는 프로그램의 오류를 관리하여 안정성을 높이는 방법입니다.
begin,rescue,ensure,raise등의 키워드를 사용하여 구현합니다.- 실무에서 자주 사용하는 패턴을 통해 예외 처리를 적용할 수 있습니다.
- 다음에 학습하면 좋은 주제: 사용자 정의 예외, 여러 예외 처리, 예외 로깅.
4. 실전 활용 예제
예외 처리는 여러 실무 상황에서 활용됩니다. 다음은 쇼핑몰과 파일 입출력 상황에서의 예제입니다.
쇼핑몰에서 장바구니 구현
사용자가 장바구니에 상품을 추가할 때, 재고가 부족한 경우를 처리하는 코드입니다.
class Product
attr_accessor :name, :stock
def initialize(name, stock)
@name = name
@stock = stock
end
end
def add_to_cart(product, quantity)
begin
raise "재고가 부족합니다!" if quantity > product.stock
product.stock -= quantity
puts "#{quantity}개 #{product.name}을 장바구니에 추가했습니다."
rescue RuntimeError => e
puts e.message
end
end
item = Product.new("스마트폰", 5)
add_to_cart(item, 10) # 재고가 부족한 경우
파일 입출력
파일을 읽을 때, 파일이 존재하지 않는 경우를 처리하는 예제입니다.
begin
file = File.open("non_existent_file.txt")
content = file.read
puts content
rescue Errno::ENOENT
puts "파일이 존재하지 않습니다."
ensure
file.close if file # 파일이 열려 있다면 닫기
end
5. 흔한 실수와 주의사항
- 잘못된 코드:
puts Integer("abc") # 예외 발생
- 올바른 코드:
begin
puts Integer("abc") # 예외 잡기
rescue ArgumentError
puts "잘못된 입력입니다."
end
- 잘못된 코드:
rescue ZeroDivisionError
- 올바른 코드:
rescue StandardError # 모든 표준 오류 처리