try:
# num = int(input("숫자를 입력하세요: "))
= 0
num = 10 / num # 0 입력 시 예외 발생
result print("결과:", result)
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
0으로 나눌 수 없습니다.
예외(Exception)는 프로그램 실행 중 발생하는 오류로, 이를 적절히 처리하지 않으면 프로그램이 강제 종료될 수 있다. Python에서는 try-except
문을 사용하여 예외를 처리(Exception Handling)하고, 프로그램이 중단되지 않도록 만들 수 있다.
기능 | 설명 |
---|---|
try |
예외가 발생할 가능성이 있는 코드 실행 |
except 예외_타입 |
특정 예외가 발생했을 때 실행 |
except Exception as e |
모든 예외를 처리하고 오류 메시지 출력 |
else |
예외가 발생하지 않았을 때 실행 |
finally |
예외 발생 여부와 관계없이 항상 실행 |
raise 예외_타입("메시지") |
직접 예외 발생 |
예외 처리를 활용하면 프로그램이 예상치 못한 오류에도 안전하게 실행될 수 있다.
try:
# 예외가 발생할 가능성이 있는 코드
except 예외_타입:
# 예외가 발생했을 때 실행할 코드
try
: 예외가 발생할 가능성이 있는 코드를 작성except
: 예외가 발생하면 실행할 코드 작성1. 0으로 나누기 예외 (ZeroDivisionError
)
try:
# num = int(input("숫자를 입력하세요: "))
= 0
num = 10 / num # 0 입력 시 예외 발생
result print("결과:", result)
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
0으로 나눌 수 없습니다.
2. 입력값이 숫자가 아닐 때 예외 (ValueError
)
try:
# num = int(input("숫자를 입력하세요: ")) # 문자를 입력하면 예외 발생
= int('abc')
num print("입력한 숫자:", num)
except ValueError:
print("올바른 숫자를 입력하세요.")
올바른 숫자를 입력하세요.
3. 여러 개의 예외 처리
try:
# num = int(input("숫자를 입력하세요: "))
= 0 # num = 'abc'
num = 10 / num
result except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except ValueError:
print("올바른 숫자를 입력하세요.")
except Exception as e:
print("예외 발생:", e)
0으로 나눌 수 없습니다.
4. else
와 finally
사용
try:
# num = int(input("숫자를 입력하세요: "))
= 0
num = 10 / num
result except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except ValueError:
print("올바른 숫자를 입력하세요.")
else:
print("연산 결과:", result)
finally:
print("프로그램 종료")
0으로 나눌 수 없습니다.
프로그램 종료
else
: 예외가 발생하지 않으면 실행finally
: 예외 발생 여부와 관계없이 항상 실행5. 사용자 정의 예외 (raise
)
class NegativeNumberError(Exception):
pass
try:
# num = int(input("양수를 입력하세요: "))
= -1
num if num < 0:
raise NegativeNumberError("음수는 입력할 수 없습니다.")
print("입력한 숫자:", num)
except NegativeNumberError as e:
print(e)
except ValueError:
print("올바른 숫자를 입력하세요.")
음수는 입력할 수 없습니다.
6. 파일 읽기 예외 (FileNotFoundError
)
try:
with open("nonexistent.txt", "r") as file:
= file.read()
content print(content)
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
파일을 찾을 수 없습니다.
디버깅(Debugging)은 코드에서 발생하는 오류(Bug)를 찾고 수정하는 과정이다. 파이썬에서는 다양한 디버깅 도구와 기법을 통해 효율적으로 오류를 해결할 수 있다.
가장 간단한 디버깅 방법으로, 변수의 값이나 코드 진행 상황을 출력하여 문제를 파악한다.
def add_numbers(a, b):
print(f"a: {a}, b: {b}") # 변수 값 출력
return a + b
= add_numbers(5, '10') # 오류 발생
result print(f"결과: {result}")
a: 5, b: 10
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) Cell In[7], line 5 2 print(f"a: {a}, b: {b}") # 변수 값 출력 3 return a + b ----> 5 result = add_numbers(5, '10') # 오류 발생 6 print(f"결과: {result}") Cell In[7], line 3, in add_numbers(a, b) 1 def add_numbers(a, b): 2 print(f"a: {a}, b: {b}") # 변수 값 출력 ----> 3 return a + b TypeError: unsupported operand type(s) for +: 'int' and 'str'
특정 조건이 참(True)인지 확인하고, 그렇지 않으면 오류를 발생시켜 디버깅에 도움을 준다.
def divide(a, b):
assert b != 0, "0으로 나눌 수 없습니다!" # 조건이 False일 경우 AssertionError 발생
return a / b
print(divide(10, 0)) # 오류 발생
--------------------------------------------------------------------------- AssertionError Traceback (most recent call last) Cell In[8], line 5 2 assert b != 0, "0으로 나눌 수 없습니다!" # 조건이 False일 경우 AssertionError 발생 3 return a / b ----> 5 print(divide(10, 0)) # 오류 발생 Cell In[8], line 2, in divide(a, b) 1 def divide(a, b): ----> 2 assert b != 0, "0으로 나눌 수 없습니다!" # 조건이 False일 경우 AssertionError 발생 3 return a / b AssertionError: 0으로 나눌 수 없습니다!
pdb
는 파이썬 내장 디버거로, 코드 실행을 중단하고 단계별로 코드 흐름을 추적할 수 있다.
디버거 삽입하기
import pdb
def buggy_function():
= 5
a = 0
b # 디버깅 시작 지점
pdb.set_trace() = a / b # 오류 발생 지점
c print(c)
buggy_function()
주요 명령어
명령어 | 설명 |
---|---|
n |
다음 줄로 이동 (Next) |
s |
함수 내부로 들어가기 (Step into) |
c |
중단점까지 계속 실행 (Continue) |
q |
디버거 종료 (Quit) |
p |
변수 값 출력 (Print) |
l |
코드 주변 줄 표시 (List) |
VS Code나 PyCharm 같은 통합 개발 환경(IDE)에서는 그래픽 디버거를 통해 직관적으로 코드를 디버깅할 수 있다.
F5
키를 눌러 디버깅 모드로 전환print()
보다 더 강력하고 유연한 로그 기록을 통해 디버깅을 수행할 수 있다. 로그 레벨을 설정하여 필요한 정보만 출력 가능하다.
import logging
# 로그 레벨 설정
=logging.DEBUG)
logging.basicConfig(level
def divide(a, b):
f"입력 값: a={a}, b={b}")
logging.debug(if b == 0:
"0으로 나눌 수 없습니다!")
logging.error(return None
return a / b
= divide(10, 0) result
DEBUG:root:입력 값: a=10, b=0
ERROR:root:0으로 나눌 수 없습니다!
로그 레벨 | 설명 |
---|---|
DEBUG |
상세한 디버깅 정보 |
INFO |
일반적인 정보 메시지 |
WARNING |
경고 메시지 |
ERROR |
오류 발생 시 메시지 |
CRITICAL |
심각한 오류 발생 시 메시지 |
예외 처리로 오류 발생 시 프로그램이 강제 종료되지 않도록 방지하고, 오류 메시지를 출력하여 문제를 분석한다.
def divide(a, b):
try:
return a / b
except ZeroDivisionError as e:
print(f"오류 발생: {e}")
return None
= divide(10, 0) result
오류 발생: division by zero
자동화된 테스트를 통해 코드의 정확성을 검증하고, 변경 사항으로 인한 오류를 빠르게 발견할 수 있다.
import unittest
def add(a, b):
return a + b
class TestMathFunctions(unittest.TestCase):
def test_add(self):
self.assertEqual(add(2, 3), 5)
self.assertEqual(add(-1, 1), 0)
if __name__ == '__main__':
unittest.main()
그외 외부 디버깅 도구는 아래 표를 참고한다.
도구/라이브러리 | 설명 |
---|---|
ipdb |
pdb 의 확장판으로, IPython 환경에 최적화 |
pylint |
코드 스타일 및 오류 검사 도구 |
pytest |
강력한 테스트 프레임워크로 디버깅 기능 지원 |
trace |
코드 실행 경로를 추적하여 디버깅에 활용 |
디버깅 시 다음과 같은 점을 주의한다.
이러한 방법들을 상황에 맞게 활용하면 파이썬에서 효율적으로 디버깅할 수 있다.