python

12편 Python 기초 문법: 오류 및 디버깅

파이썬 티쳐 2024. 11. 16. 09:53

1. 디버깅의 중요성

1.1 디버깅의 개념과 필요성

디버깅(Debugging)은 프로그램에서 발생한 오류를 찾아 수정하는 과정입니다. 프로그램이 예상치 못한 오류로 인해 제대로 작동하지 않을 경우, 디버깅을 통해 문제를 해결할 수 있습니다. 이는 프로그램의 안정성과 신뢰성을 높이는 데 필수적입니다.

1.2 일반적인 오류 유형

  • 문법 오류(Syntax Error): 잘못된 구문을 사용할 때 발생하는 오류.
print("Hello, Python"  # SyntaxError: unexpected EOF while parsing
  • 논리 오류(Logic Error): 프로그램이 정상적으로 실행되지만 기대한 결과가 나오지 않는 오류.
  • 런타임 오류(Runtime Error): 실행 도중에 발생하는 오류 (예: 0으로 나누기).
number = 10 / 0  # ZeroDivisionError: division by zero

1.3 오류 메시지 분석 방법 (Traceback 메시지 해석)

Python은 오류가 발생한 코드의 실행 경로와 오류 유형을 포함한 Traceback 메시지를 출력합니다.

Traceback (most recent call last):
  File "example.py", line 2, in <module>
    number = 10 / 0
ZeroDivisionError: division by zero

2. 디버깅 도구와 방법

2.1 print() 디버깅 기법

가장 기본적인 디버깅 방법으로, print() 함수를 사용하여 변수의 값을 출력해 중간 상태를 확인할 수 있습니다.

def add(a, b):
    print(f"a: {a}, b: {b}")  # 변수를 출력하여 상태 확인
    return a + b

result = add(5, 10)
print(result)  # 출력: 15

2.2 파이썬 표준 라이브러리 pdb를 활용한 디버깅

pdb는 Python의 표준 디버깅 도구로, 프로그램 실행을 단계별로 추적하여 오류를 찾는 데 유용합니다.

import pdb

def add(a, b):
    pdb.set_trace()  # 여기서 코드 실행을 멈추고 디버깅 시작
    return a + b

result = add(5, 10)
print(result)
  • n (next): 다음 줄로 이동.
  • c (continue): 디버깅을 끝내고 프로그램 실행을 계속함.
  • p (print): 변수를 출력하여 값을 확인함.
  • q (quit): 디버깅을 중단하고 종료.

2.3 IDE의 디버깅 도구 (PyCharm, VSCode)

IDE에서 제공하는 디버깅 도구는 시각적이고 사용이 간편합니다. PyCharm이나 VSCode에서 브레이크포인트 설정, 변수 값 확인, 단계별 실행 등을 통해 디버깅할 수 있습니다.

3. 실전 디버깅 예제

3.1 pdb를 이용한 단계별 코드 실행 및 오류 찾기

import pdb

def divide(a, b):
    pdb.set_trace()  # 여기서 코드가 중단됨
    return a / b

try:
    result = divide(10, 0)
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

pdb.set_trace()로 프로그램이 중단되면, n 명령을 입력하여 코드를 한 줄씩 실행하고 p 명령어로 변수 값을 확인할 수 있습니다.

3.2 오류가 발생하는 프로그램을 분석하고 수정하는 연습

다음 프로그램은 빈 리스트가 들어올 경우 ZeroDivisionError가 발생할 수 있습니다. 이를 해결하기 위해 리스트가 비어 있는지 확인하는 코드를 추가합니다.

def calculate_average(grades):
    if not grades:  # 리스트가 비어 있는지 확인
        return 0
    total = sum(grades)
    count = len(grades)
    return total / count

grades = []
average = calculate_average(grades)
print(f"평균 점수: {average}")  # 출력: 평균 점수: 0

이제 빈 리스트가 들어와도 오류 없이 0을 반환하게 됩니다.