-
Python의 예외 처리 방법: try, except, finally 이해하기코딩/파이썬 2023. 7. 30. 12:47반응형
코드를 만들다 보면 예상치 못한 오류가 발생하여 프로그램이 중단되는 경우가 있습니다. 오류는 예측할 수 없는 다양한 원인으로 발생합니다. 모든 케이스를 코드에 반영하지 못하기 때문에, 예측 범위를 벗어난 경우에 예외 처리를 하면 좋습니다. 이 글에서는 파이썬의 예외 처리 방법인 try, except, finally에 대해 알아보겠습니다.
목차
- 1. 예외 처리는 왜 필요한가?
- 2. Python에서 예외 처리 방법 : try, except, finally
- 3. 예외는 언제 발생하는가? - 사례 중심으로
- 4. 기타 Python 내장 예외(Exception)
1. 예외 처리는 왜 필요한가?
프로그래밍에서 예외는 언제나 발생할 수 있는 불가피한 현상입니다. 이런 예외적인 상황을 미리 예측하고, 적절하게 대응하는 것이 바로 '예외 처리'의 역할입니다. 예외 처리가 필요한 주된 이유들은 아래와 같습니다.
- 1) 안정성 향상:
예외 처리를 통해 프로그램은 예상치 못한 상황에도 유연하게 대응할 수 있게 됩니다. 예외가 발생하더라도 적절한 메시지를 보여주거나, 대체적인 동작을 수행하게 함으로써 프로그램이 계속 실행될 수 있습니다. - 2) 사용자 경험 향상:
프로그램이 예기치 않게 중단되면 사용자 경험에 부정적인 영향을 미칩니다. 예외 처리를 통해, 이런 상황을 방지하고 사용자에게 적절한 피드백을 제공할 수 있습니다. - 3) 유지보수성 강화:
예외 처리는 코드의 디버깅을 돕습니다. 예외가 발생했을 때 적절한 메시지와 함께 예외 정보를 출력하면, 해당 오류를 빠르게 파악하고 수정할 수 있습니다. - 4) 프로그램의 신뢰성 제고:
예외 처리를 통해 프로그램은 예외 상황에 대비하는 강건함을 가집니다. 이는 프로그램의 전반적인 신뢰성을 높이는 데 도움을 줍니다.
2. Python에서 예외 처리 방법 : try, except, finally
Python에서는 try, except, finally 문을 사용해 예외를 처리합니다. 각각의 역할은 아래와 같습니다.
- try :
예외가 발생할 수 있는 코드 블럭을 정의합니다. - except :
try 블럭에서 예외가 발생했을 때 실행할 코드를 정의합니다.
except 옆에 ZeroDivisionError 같은 특정 예외처리 케이스를 추가할 수 있습니다.
예외 케이스를 추가하지 않으면, 모든 예외에 대해서 처리됩니다. - finally :
예외 발생 여부와 상관 없이 항상 실행되는 코드 블럭을 정의합니다.
아래에 간단한 예시를 살펴봅시다.
# try, except, finally 사용 사례 try: print(5/0) # ZeroDivisionError를 발생시킵니다. except ZeroDivisionError: print("0으로 나눌 수 없습니다.") #ZeroDivisionError 에 대한 처리 finally: print("이 코드는 항상 실행됩니다.")
이 코드를 실행하면, "0으로 나눌 수 없습니다."와 "이 코드는 항상 실행됩니다." 두 메시지가 출력됩니다. 여기서 ZeroDivisionError는 오류의 종류를 의미합니다.
만약 try, except 사용하지 않고 숫자를 0으로 나눴다면, 아래와 같이 오류가 발생하면서 프로그램이 중단됩니다.
하지만 try, excpet 구문을 사용하게 되면, 프로그램의 중단없이 오류를 처리할 수 있게 됩니다.
만약 특정 예외를 지정하지 않고, 모든 예외를 하나의 코드로 처리하고 싶다면 아래와 같이 작성하시면 됩니다. 위 예시에서 ZeroDivisionError 같은 예외명을 명시하지 않으면 됩니다.
# try, except, finally 사용 사례 try: print(5/0) # ZeroDivisionError를 발생시킵니다. except : print("0으로 나눌 수 없습니다.") #ZeroDivisionError 에 대한 처리 finally: print("이 코드는 항상 실행됩니다.")
3. 예외는 언제 발생하는가? - 사례 중심으로
프로그램을 작성하다 보면 다양한 원인으로 인해 예외가 발생합니다. 여기서는 일반적으로 흔히 발생하는 예외 상황들을 사례를 통해 알아보겠습니다.
1) 데이터 타입 관련 예외
변수나 데이터의 타입이 예상과 다르면 예외가 발생합니다. 예를 들어, 정수로 변환할 수 없는 문자열을 int() 함수로 변환하려고 시도하면 ValueError 예외가 발생합니다.
try: int('python') # 숫자가 아닌 문자열을 정수로 변환하려고 시도합니다. except ValueError: print('ValueError: 잘못된 변환입니다.') # ValueError 발생
2) 리소스 접근 관련 예외
파일을 열거나, 네트워크 자원에 접근하는 등의 동작 중에 문제가 발생하면 예외가 발생합니다. 예를 들어, 존재하지 않는 파일을 열려고 하면 FileNotFoundError 예외가 발생합니다.
try: open('nonexistentfile.txt', 'r') # 존재하지 않는 파일을 열려고 합니다. except FileNotFoundError: print('FileNotFoundError: 파일을 찾을 수 없습니다.') # FileNotFoundError 오류 발생
3) 인덱스 관련 예외
리스트나 튜플 같은 시퀀스 자료형에서 범위를 벗어나는 인덱스로 접근하려고 하면 IndexError 예외가 발생합니다.
try: list = [1, 2, 3] print(list[3]) # 리스트의 범위를 벗어난 값을 요구합니다. except IndexError: print('IndexError: 리스트의 인덱스 범위를 벗어났습니다.')
4. 기타 Python 내장 예외(Exception)
위의 주요 사례 외에는 python에서는 기본 내장 예외를 제공합니다. 아래는 주요 제외 목록입니다.
- IOError: I/O 연산(파일 열기, 읽기, 쓰기 등) 실패 시 발생합니다.
- ImportError: import문이 모듈을 로드하는데 실패할 때 발생합니다.
- IndexError: 시퀀스의 인덱스가 범위를 벗어났을 때 발생합니다.
- KeyError: 딕셔너리에서 존재하지 않는 키를 사용하려고 할 때 발생합니다.
- KeyboardInterrupt: 사용자가 인터럽트 키(보통 Control+C 또는 Delete)를 눌렀을 때 발생합니다.
- NameError: 지역 또는 전역 이름을 찾을 수 없을 때 발생합니다.
- OSError: 시스템 함수가 시스템 관련 오류를 반환할 때 발생합니다.
- OverflowError: 수치 연산의 결과가 너무 크면 발생합니다.
- SyntaxError: 구문 분석 도중 발생합니다.
- TypeError: 연산이나 함수가 적절하지 않은 형의 객체에 적용될 때 발생합니다.
- ValueError: 연산이나 함수가 적절한 값이 아닌 객체에 적용될 때 발생합니다.
- ZeroDivisionError: 0으로 다른 숫자를 나누려고 할 때 발생합니다.
- FileNotFoundError: 요청된 파일 또는 디렉토리를 찾을 수 없을 때 발생합니다.
- TimeoutError: 시스템 함수가 시간 초과에 걸렸을 때 발생합니다.
- MemoryError: 작업을 수행하기 위한 충분한 메모리가 없을 때 발생합니다.
- RecursionError: 최대 재귀 깊이를 초과할 때 발생합니다.
- NotImplementedError: 추상 메서드가 파생 클래스에서 오버라이드되지 않았을 때 발생합니다.
- StopIteration: 더 이상 반환할 항목이 없는 경우, 반복자나 제너레이터가 이 예외를 발생시킵니다.
- UnboundLocalError: 로컬 변수를 참조하지만 적절한 값으로 초기화되지 않았을 때 발생합니다.
이상 Python 예외 처리에 대한 포스팅이었습니다.
https://smart-worker.tistory.com/50
https://smart-worker.tistory.com/53
https://smart-worker.tistory.com/49
반응형'코딩 > 파이썬' 카테고리의 다른 글
[Python] 파이썬 enumerate 함수로 For 문 돌리기 (0) 2023.07.31 [Python] 문자열 서식 지정, 포매팅 방식 및 format 함수 (0) 2023.07.30 [Python] JSON 데이터 손쉽게 다루기 (0) 2023.07.30 [Python] 텍스트 파일 읽고 쓰기(open, readlines 등) (0) 2023.07.30 [Python] GIL(Global interpreter Lock) 이해하기 (0) 2023.07.29