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. puts와 p로 값 출력
가장 간단한 방법은 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 라이브러리를 기본으로 제공하며, 이를 이용하면 강력한 디버깅이 가능하다.
설치 및 실행 방법
debug라이브러리 설치 (Ruby 3.1 이상에서는 기본 제공)
gem install debug
- 코드에
require "debug"추가
require "debug"
def test_method
x = 5
y = 10
debugger # 여기서 실행이 멈춤
z = x + y
puts z
end
test_method
- 프로그램 실행 시 디버깅 모드가 활성화됨
(rdbg) p x
5
(rdbg) next
(rdbg) continue
6. 마무리
이번 글에서는 Ruby에서 예외 처리와 디버깅 기법을 살펴보았다.
📌 예외 처리 정리
begin-rescue→ 예외 처리ensure→ 예외 발생 여부와 관계없이 실행raise→ 강제 예외 발생- 사용자 정의 예외 →
class CustomError < StandardError
📌 디버깅 기법 정리
puts,p→ 변수 값 출력irb→ 대화형 실행binding.irb→ 특정 지점에서 멈추고 값 확인debugger→ 정식 디버깅 툴 사용 (debug라이브러리)
이제 예외를 안전하게 처리하고, 버그를 효과적으로 찾아 수정할 수 있다!