Python 예외 처리: 포착하고 출력하는 방법
Python에서 예외를 포착하고 전체 추적 정보를 출력하면서 프로그램 종료를 방지하는 방법
Python 프로그래밍에서 예외는 예상치 못한 오류나 문제가 발생했음을 나타내는 신호입니다. try-except
블록을 사용하여 예외를 처리하고 프로그램이 충돌하지 않고 계속 실행되도록 할 수 있습니다. 하지만, 예외가 발생했을 때 어디에서 오류가 발생했는지 파악하기 위해서는 **추적 정보(traceback)**를 출력하는 것이 중요합니다.
전체 추적 정보 출력
다음은 예외가 발생했을 때 전체 추적 정보를 출력하고 프로그램을 종료하지 않는 방법의 예시입니다.
import traceback
try:
# 오류를 일으키는 코드
5 / 0
except Exception as e:
# 예외 처리 코드
print('예외 발생:')
print(e)
# 전체 추적 정보 출력
traceback.print_exc()
# 프로그램 종료 방지
pass
설명
import traceback
문장은traceback
모듈을 가져옵니다. 이 모듈은 예외 추적 정보를 처리하는 데 사용되는 함수를 제공합니다.try
블록은 오류가 발생할 가능성이 있는 코드를 포함합니다.except Exception as e:
블록은Exception
또는 그 하위 클래스인 모든 예외를 포착합니다.e
변수에는 발생한 예외 객체가 저장됩니다.print('예외 발생:')
문장은 예외가 발생했음을 나타내는 메시지를 출력합니다.print(e)
문장은 예외 객체 자체를 출력합니다. 이를 통해 예외 유형 및 오류 메시지를 확인할 수 있습니다.traceback.print_exc()
함수는 전체 추적 정보를 콘솔에 출력합니다. 이를 통해 예외가 발생한 코드 위치를 파악할 수 있습니다.pass
문장은 예외를 처리한 후 프로그램을 계속 실행하도록 합니다.
주의 사항
pass
대신 예외를 처리하는 코드를 작성할 수도 있습니다. 예를 들어, 오류 발생 시 로그 파일에 메시지를 기록하거나 사용자에게 알림을 표시하는 코드를 작성할 수 있습니다.- 특정 예외 유형만 처리하려는 경우
except
블록에 여러 개의except
절을 사용할 수 있습니다.
추가 정보
traceback
모듈은 다음과 같은 다양한 함수를 제공합니다.format_exc()
: 예외 추적 정보를 문자열로 반환합니다.extract_tb()
: 예외 추적 정보를 리스트로 반환합니다.print_tb()
: 예외 추적 정보를 콘솔에 출력합니다.
예제 코드: 특정 예외 처리 및 파일 저장
import traceback
def main():
try:
# 오류를 일으키는 코드
5 / 0
except ZeroDivisionError as e:
# ZeroDivisionError 예외만 처리
print('ZeroDivisionError 예외 발생:')
print(e)
traceback.print_exc(file=open('error.log', 'w'))
except Exception as e:
# 다른 예외는 기본 처리
print('예외 발생:')
print(e)
traceback.print_exc()
finally:
# 프로그램 종료 전에 항상 실행되는 코드
print('프로그램 종료')
if __name__ == '__main__':
main()
설명:
main()
함수는 프로그램의 진입점입니다.try
블록은 오류가 발생할 가능성이 있는 코드를 포함합니다.except ZeroDivisionError as e:
블록은ZeroDivisionError
예외만을 포착합니다.e
변수에는 발생한 예외 객체가 저장됩니다.print('ZeroDivisionError 예외 발생:')
문장은 예외 발생 유형을 나타내는 메시지를 출력합니다.print(e)
문장은 예외 객체 자체를 출력합니다.traceback.print_exc(file=open('error.log', 'w'))
함수는 전체 추적 정보를 'error.log' 파일에 저장합니다.
except Exception as e:
블록은ZeroDivisionError
이외의 다른 예외를 포착합니다.print('예외 발생:')
문장은 예외 발생 유형을 나타내는 메시지를 출력합니다.print(e)
문장은 예외 객체 자체를 출력합니다.traceback.print_exc()
함수는 전체 추적 정보를 콘솔에 출력합니다.
finally
블록은try
블록에서 예외가 발생했는지 여부에 관계없이 항상 실행됩니다.print('프로그램 종료')
문장은 프로그램 종료를 나타내는 메시지를 출력합니다.
사용 방법:
- 위 코드를 파일에 저장합니다 (예:
example.py
). - 터미널에서 다음 명령을 실행합니다:
python example.py
- 프로그램이 실행되면 'error.log' 파일에 예외 추적 정보가 저장됩니다.
변경 사항:
- 이 예제에서는
traceback.print_exc(file=open('error.log', 'w'))
를 사용하여 오류 추적 정보를 파일에 저장합니다. except
블록을 여러 개 사용하여 다양한 예외 유형을 처리할 수 있습니다.finally
블록을 사용하여 프로그램 종료 전에 항상 실행해야 하는 코드를 작성할 수 있습니다.
Python 예외 처리 대체 방법
contextlib.closing 사용
contextlib
모듈의 closing
함수는 파일이나 소켓과 같은 객체를 자동으로 닫아주는 데 사용할 수 있습니다. 예외가 발생하더라도 객체가 제대로 닫히도록 하기 때문에 유용합니다.
import contextlib
with contextlib.closing(open('myfile.txt', 'r')) as f:
try:
# 파일 내용 처리
content = f.read()
except Exception as e:
# 예외 처리 코드
print(f'오류 발생: {e}')
logging
모듈은 프로그램의 실행 중에 발생하는 이벤트를 기록하는 데 사용할 수 있습니다. 예외 발생 시 로그 메시지를 출력하여 문제를 진단하는 데 도움이 될 수 있습니다.
import logging
logging.basicConfig(filename='mylog.txt', level=logging.DEBUG)
try:
# 오류를 일으키는 코드
5 / 0
except Exception as e:
# 예외 처리 코드
logging.exception(e)
커스텀 예외 만들기
더 복잡한 상황에서는 자체 예외 클래스를 만들어 특정 오류 조건을 처리할 수 있습니다. 이렇게 하면 예외 처리 코드를 더욱 명확하고 유지 관리하기 쉽게 만들 수 있습니다.
class MyError(Exception):
pass
def my_function():
if some_condition:
raise MyError('특정 조건 충족 시 오류 발생')
try:
my_function()
except MyError as e:
# MyError 예외 처리 코드
print(f'MyError 발생: {e}')
except Exception as e:
# 다른 예외 처리 코드
print(f'예외 발생: {e}')
sys.exc_info()
함수는 현재 처리되고 있는 예외에 대한 정보를 가져오는 데 사용할 수 있습니다. 이 정보를 사용하여 예외 유형, 오류 메시지 및 추적 정보를 추출할 수 있습니다.
try:
# 오류를 일으키는 코드
5 / 0
except Exception:
# 예외 처리 코드
e_type, e_value, e_traceback = sys.exc_info()
print(f'예외 유형: {e_type}')
print(f'오류 메시지: {e_value}')
print(f'추적 정보:')
traceback.print_tb(e_traceback)
pdb
모듈은 Python 디버거를 제공합니다. 예외가 발생하면 pdb
모듈이 자동으로 실행되어 코드를 단계별로 진행하고 변수 값을 검사하는 데 도움이 될 수 있습니다.
import pdb
try:
# 오류를 일으키는 코드
5 / 0
except Exception:
# 예외 발생 시 디버거 실행
pdb.post_mortem()
결론
각 방법에는 장단점이 있습니다. 상황에 따라 가장 적합한 방법을 선택해야 합니다.
- 간단한 예외 처리에는
try-except
구문을 사용하는 것이 가장 일반적입니다. - 파일이나 소켓을 자동으로 닫아야 하는 경우
contextlib.closing
을 사용하는 것이 좋습니다. - 예외 발생 시 로그 메시지를 기록해야 하는 경우
logging
모듈을 사용하는 것이 좋습니다. - 더 복잡한 오류 조건을 처리해야 하는 경우 자체 예외 클래스를 만드는 것이 좋습니다.
- 예외에 대한 자세한 정보가 필요한 경우
sys.exc_info()
함수를 사용하는 것이 좋습니다. - 코드를 단계별로 디버그해야 하는 경우
pdb
모듈을 사용하는 것이 좋습니다.
python exception try-catch