목차
- 예외란
- 예외 객체
- 예외를 구분하는 방법
- 예외를 처리하는 과정과 프로그램이 갑자기 종료되는 이유
- raise 키워드
예외란
파이썬에서 예외는 프로그램 실행 중에 오류나 비정상적인 조건이 발생했을 때 발생하는 이벤트입니다. 예외는 프로그램이 정상적으로 처리하거나 진행할 수 없는 상황이 발생했을 때 발생합니다.
예외는 일반적으로 코드의 오류 또는 0으로 나누기, 목록에 존재하지 않는 요소 액세스, 존재하지 않는 파일 열기 시도와 같은 예기치 않은 상황에 의해 트리거됩니다. 예외가 발생하면 프로그램의 정상적인 흐름이 중단되고 프로그램은 예외 처리기라는 특수 코드 블록으로 이동합니다.
Python에서 예외는 기본 클래스 BaseException에서 파생된 클래스의 인스턴스인 객체입니다. Python 표준 라이브러리에는 다양한 유형의 오류에 해당하는 ValueError, TypeError, IndexError 및 FileNotFoundError와 같은 다양한 기본 제공 예외 클래스가 있습니다. BaseException 클래스 또는 그 하위 클래스 중 하나에서 상속하여 사용자 정의 예외 클래스를 정의할 수도 있습니다.
Python의 예외 처리는 try-except 블록을 사용하여 수행됩니다. 예외를 발생시킬 수 있는 코드는 try 블록 안에 배치되고 예외를 처리하는 코드는 예외 블록 안에 배치됩니다. try 블록에서 예외가 발생하면 프로그램은 해당 예외 블록으로 점프하여 예외를 처리합니다. 예외가 발생하지 않으면 프로그램은 try-except 블록 이후에도 코드를 계속 실행합니다.
예외 객체
파이썬에서 예외 객체는 베이스 클래스 BaseException에서 파생된 클래스의 인스턴스입니다. 예외 객체는 프로그램 실행 중에 오류 또는 비정상적인 조건이 발생할 때 생성됩니다. 이러한 객체에는 발생한 오류에 대한 정보가 포함되어 있어 예외를 적절히 처리할 수 있습니다.
예외가 발생하면 Python은 발생한 특정 오류 유형과 관련된 예외 객체를 생성합니다. Python 표준 라이브러리에서 제공하는 기본 제공 예외 클래스(예: ValueError, TypeError, IndexError 및 FileNotFoundError)가 있습니다. 이러한 클래스는 다양한 유형의 오류에 대응하며 BaseException 클래스 또는 그 하위 클래스 중 하나에서 상속됩니다.
BaseException 클래스 또는 그 하위 클래스 중 하나에서 상속하여 사용자 지정 예외 클래스를 직접 만들 수도 있습니다. 사용자 지정 예외 클래스를 정의하면 오류에 대한 보다 구체적인 정보를 제공하고 코드에서 오류를 보다 정확하게 처리할 수 있습니다.
try-except 블록을 사용하여 예외를 처리할 때 as 키워드를 사용하여 예외 객체를 캡처할 수 있습니다. 이렇게 하면 오류 메시지나 예외와 관련된 추가 데이터 등 객체에 포함된 정보에 액세스할 수 있습니다. 다음은 예시입니다:
try:
result = 1 / 0
except ZeroDivisionError as e:
print(f"An error occurred: {e}")
이 예제에서는 0으로 나눗셈이 발생하면 ZeroDivisionError 예외가 발생합니다. 예외 블록은 as 키워드를 사용하여 예외 객체를 캡처하고 변수 e에 할당합니다. 그러면 예외 객체에 포함된 오류 메시지가 인쇄됩니다.
예외를 구분하는 방법
Python에서는 try-except 문에 여러 개의 예외 블록을 지정하여 다양한 유형의 예외를 구분할 수 있습니다. 각 예외 블록은 특정 예외 유형과 연관되어 있으므로 다양한 오류를 맞춤형으로 처리할 수 있습니다. 다음은 이 개념을 설명하는 예제입니다.
try:
# 예외를 발생시킬 수 있는 일부 코드
result = 1 / 0
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except ValueError:
print("유효하지 않은 값이 발생했습니다.")
except TypeError:
print("잘못된 데이터 타입이 사용되었습니다.")
이 예제에서 try 블록에는 예외를 발생시킬 수 있는 코드가 포함되어 있습니다. 예외가 발생하면 프로그램은 각 예외 블록을 검사하여 발생한 예외에 해당하는 예외 블록을 찾습니다. 일치하는 예외 블록이 발견되면 해당 블록 내의 코드가 실행됩니다.
각 예외 블록에서 as 키워드를 사용하여 예외 객체를 캡처할 수도 있습니다. 이렇게 하면 오류에 대한 자세한 정보에 액세스할 수 있습니다:
try:
# 예외를 발생시킬 수 있는 일부 코드
result = 1 / 0
except ZeroDivisionError as e:
print(f"ZeroDivisionError occurred: {e}")
except ValueError as e:
print(f"ValueError occurred: {e}")
except TypeError as e:
print(f"TypeError occurred: {e}")
여러 예외 블록을 사용하고 서로 다른 예외 유형을 지정하면 다양한 예외를 다르게 처리하고 적절한 오류 메시지 또는 복구 작업을 제공할 수 있습니다.
예외를 처리하는 과정과 프로그램이 갑자기 종료되는 이유
Python에서 예외를 처리하기 위해 여러 개의 예외 블록을 사용하는 경우 프로그램은 if-elif-else 조건문이 작동하는 방식과 유사하게 각 블록을 순차적으로 확인합니다. 발생한 예외가 예외 블록에 지정된 유형과 일치하면 해당 블록 내의 코드가 실행됩니다. 예외 블록 중 발생한 예외와 일치하는 블록이 없으면 예외가 처리되지 않은 상태로 유지되어 프로그램이 갑자기 종료됩니다. 이 개념을 설명하기 위해 예제를 살펴보겠습니다.
try:
# 예외를 발생시킬 수 있는 일부 코드
value = int("abc")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except ValueError:
print("유효하지 않은 값이 발생했습니다.")
이 예제에서 try 블록에는 숫자가 아닌 문자열을 정수로 변환하려고 시도하는 코드가 포함되어 있으며, 이로 인해 ValueError가 발생합니다. 프로그램은 블록을 제외한 각 블록을 순서대로 검사하고 ValueError 블록을 찾으면 해당 블록 내의 코드를 실행합니다.
그러나 발생한 예외가 지정된 예외 유형과 일치하지 않는 경우 프로그램은 처리되지 않은 예외로 종료됩니다. 예를 들어
try:
# 예외를 발생시킬 수 있는 일부 코드
value = int("abc")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
이 경우 ValueError가 발생하지만 이를 처리할 수 있는 예외 블록이 없습니다. 결과적으로 프로그램은 처리되지 않은 예외와 함께 종료됩니다.
이 시나리오를 방지하려면 마지막에 일반 예외 블록을 추가하여 처리되지 않은 나머지 예외를 처리할 수 있습니다:
try:
# 예외를 발생시킬 수 있는 일부 코드
value = int("abc")
except ZeroDivisionError:
print("0으로 나눌 수 없습니다.")
except ValueError:
print("유효하지 않은 값이 발생했습니다.")
except Exception:
print("예기치 않은 오류가 발생했습니다.")
이렇게 추가하면 특정 예외 블록과 일치하지 않는 예외가 발생해도 일반 예외 블록이 이를 처리하여 프로그램이 예기치 않게 종료되는 것을 방지할 수 있습니다.
raise 키워드
Python의 raise 키워드는 프로그램 실행 중에 예외를 수동으로 발생시키는 데 사용됩니다. 기본 제공 예외를 발생시키거나 사용자 정의 예외를 정의할 수 있습니다. 예외를 발생시킨다는 것은 프로그램의 정상적인 흐름을 중단하고 일반적으로 시도 예외 블록 내부의 예외 처리기로 제어권을 넘기겠다는 의미입니다. 다음은 raise 키워드를 사용하는 방법의 예시입니다.
def check_age(age):
if age < 0:
raise ValueError("나이는 음수일 수 없습니다")
try:
user_age = -5
check_age(user_age)
except ValueError as ve:
print(f"Error: {ve}")
이 예제에서는 나이 매개변수를 받는 check_age 함수를 정의했습니다. 연령이 0보다 작으면 사용자 정의 오류 메시지와 함께 ValueError를 발생시킵니다. try 블록에서는 유효하지 않은 나이 -5를 사용하여 check_age 함수를 호출합니다. ValueError가 발생하면 해당 예외 블록으로 제어가 전달되고 예외를 포착하여 오류 메시지를 출력합니다.
raise 키워드를 사용하면 문제를 보다 효과적으로 식별하고 수정하는 데 도움이 되는 설명이 포함된 오류 메시지로 예외를 발생시키고 처리하여 프로그램에서 보다 강력하고 의미 있는 오류 처리를 생성할 수 있습니다.
'Python > Python 기본' 카테고리의 다른 글
[Python] 다양한 내부 모듈의 종류와 활용 PART.1 (0) | 2023.05.05 |
---|---|
[Python] 모듈이란? (0) | 2023.05.04 |
[Python] 다양한 오류와 해결 방안 (2) (0) | 2023.05.02 |
[Python] 다양한 오류와 해결 방안 (1) (0) | 2023.05.02 |
[Python] 객체를 함수로 전달하는 방법 (0) | 2023.04.30 |