Files
ruby-examples/docs/07_예외 처리와 디버깅.md

5.5 KiB

Ruby에서 예외 처리와 디버깅

프로그램을 개발할 때 예외 처리(Exception Handling) 는 필수적인 요소다. 오류를 제대로 처리하지 않으면 프로그램이 예상치 못한 방식으로 종료되거나, 심각한 버그가 발생할 수 있다. 또한 디버깅(Debugging) 기법을 활용하면 문제를 쉽게 찾아낼 수 있다. 이번 글에서는 예외 처리 기법과 디버깅 방법을 소개한다.


1. 예외(Exception)란?

예외(Exception)는 프로그램 실행 중 발생하는 오류이다. Ruby에서는 예외가 발생하면 프로그램이 즉시 종료되지만, 적절한 예외 처리를 통해 오류를 방지할 수 있다.

예외 발생 예시

puts 10 / 0  # ZeroDivisionError 발생
array = [1, 2, 3]
puts array[10]  # IndexError 발생

위 코드들은 실행 중 오류가 발생하며, 프로그램이 강제 종료된다. 이를 방지하기 위해 begin-rescue 문을 사용한다.


2. 예외 처리 (begin-rescue)

Ruby에서는 begin-rescue 블록을 사용해 예외를 처리할 수 있다.

begin
  puts 10 / 0
rescue ZeroDivisionError
  puts "0으로 나눌 수 없습니다!"
end

출력:

0으로 나눌 수 없습니다!

여러 개의 예외 처리

여러 종류의 예외를 처리하려면 rescue를 여러 개 사용할 수 있다.

begin
  array = [1, 2, 3]
  puts array[10]  # IndexError 발생
rescue ZeroDivisionError
  puts "0으로 나눌 수 없습니다!"
rescue IndexError
  puts "잘못된 인덱스 접근입니다!"
end

출력:

잘못된 인덱스 접근입니다!

모든 예외 처리 (rescue StandardError)

모든 예외를 처리하려면 rescue StandardError를 사용한다.

begin
  puts 10 / 0
rescue StandardError => e
  puts "예외 발생: #{e.message}"
end

출력:

예외 발생: divided by 0

예외 발생 여부와 관계없이 실행 (ensure)

ensure 블록을 사용하면 예외 발생 여부와 관계없이 반드시 실행해야 하는 코드를 넣을 수 있다.

begin
  file = File.open("example.txt", "r")
  puts file.read
rescue Errno::ENOENT
  puts "파일을 찾을 수 없습니다!"
ensure
  file.close if file  # 파일이 열려 있다면 닫기
end

3. 예외 강제 발생 (raise)

raise 문을 사용하면 강제로 예외를 발생시킬 수 있다.

def divide(a, b)
  raise ArgumentError, "0으로 나눌 수 없습니다!" if b == 0
  a / b
end

begin
  puts divide(10, 0)
rescue ArgumentError => e
  puts "오류 발생: #{e.message}"
end

출력:

오류 발생: 0으로 나눌 수 없습니다!

4. 사용자 정의 예외 클래스

Ruby에서는 예외 클래스를 직접 정의할 수도 있다.

class CustomError < StandardError; end

def check_value(value)
  raise CustomError, "값이 너무 큽니다!" if value > 100
end

begin
  check_value(200)
rescue CustomError => e
  puts "사용자 정의 예외 발생: #{e.message}"
end

출력:

사용자 정의 예외 발생: 값이 너무 큽니다!

5. 디버깅 기법

디버깅(Debugging)은 프로그램의 오류를 찾아 수정하는 과정이다. Ruby에서 디버깅하는 방법을 알아보자.

5.1. putsp로 값 출력

가장 간단한 방법은 puts 또는 p를 사용해 변수 값을 확인하는 것이다.

name = "홍길동"
puts "이름: #{name}"
p name  # `p`는 데이터 타입까지 출력해 줌

5.2. irb(Interactive Ruby) 사용

Ruby의 대화형 콘솔 irb를 활용하면 코드를 실행하며 디버깅할 수 있다.

$ irb
irb(main):001:0> 10 / 2
=> 5
irb(main):002:0> "hello".upcase
=> "HELLO"

5.3. binding.irb로 중간 디버깅

binding.irb를 코드 중간에 넣으면 특정 지점에서 실행을 멈추고 irb에서 값을 확인할 수 있다.

require "irb"

def debug_example
  x = 10
  y = 20
  binding.irb  # 여기서 실행이 멈추고 irb에서 값을 확인할 수 있음
  z = x + y
  puts z
end

debug_example

5.4. debug 라이브러리 사용

Ruby 3.1부터 debug 라이브러리를 기본으로 제공하며, 이를 이용하면 강력한 디버깅이 가능하다.

설치 및 실행 방법

  1. debug 라이브러리 설치 (Ruby 3.1 이상에서는 기본 제공)
gem install debug
  1. 코드에 require "debug" 추가
require "debug"

def test_method
  x = 5
  y = 10
  debugger  # 여기서 실행이 멈춤
  z = x + y
  puts z
end

test_method
  1. 프로그램 실행 시 디버깅 모드가 활성화됨
(rdbg) p x
5
(rdbg) next
(rdbg) continue

6. 마무리

이번 글에서는 Ruby에서 예외 처리와 디버깅 기법을 살펴보았다.

📌 예외 처리 정리

  • begin-rescue → 예외 처리
  • ensure → 예외 발생 여부와 관계없이 실행
  • raise → 강제 예외 발생
  • 사용자 정의 예외 → class CustomError < StandardError

📌 디버깅 기법 정리

  • puts, p → 변수 값 출력
  • irb → 대화형 실행
  • binding.irb → 특정 지점에서 멈추고 값 확인
  • debugger → 정식 디버깅 툴 사용 (debug 라이브러리)

이제 예외를 안전하게 처리하고, 버그를 효과적으로 찾아 수정할 수 있다!