프로그래밍을 하다 보면 런타임 중 예기치 않은 상황이 발생할 수 있습니다. 이러한 상황을 예외(exception)라고 하며, 파이썬에서는 이러한 예외를 우아하게 처리할 수 있는 다양한 방법을 제공합니다. 이 글에서는 예외의 개념, 파이썬에서 예외를 처리하는 방법, 사용자 정의 예외 생성, 그리고 예외가 발생한 후의 흐름 제어에 대해 상세히 설명합니다.
예외란 무엇인가?
예외란 프로그램의 정상적인 흐름을 방해하는 런타임 오류입니다. 예를 들어, 숫자를 0으로 나누려고 할 때, 존재하지 않는 파일을 열려고 할 때 또는 네트워크가 불안정하여 연결이 끊어질 때 예외가 발생할 수 있습니다. 이러한 오류는 예외로 처리되어야 프로그램이 예기치 않게 종료되는 것을 방지하고, 개발자가 그에 맞는 대응을 할 수 있게 해줍니다.
파이썬의 내장 예외(Exception Classes)
파이썬은 많은 내장(built-in) 예외 클래스들을 제공합니다. 기본적인 예외 클래스는 Exception
이며, 모든 내장 예외는 이 클래스에서 파생됩니다. 몇 가지 주요 내장 예외 클래스는 다음과 같습니다:
IndexError
: 시퀀스 인덱스가 범위를 벗어났을 때 발생합니다.KeyError
: 딕셔너너리에서 존재하지 않는 키를 참조할 때 발생합니다.ValueError
: 부적절한 값을 연산이나 함수에 제공할 때 발생합니다.TypeError
: 부적절한 유형의 인자를 함수에 제공할 때 발생합니다.ZeroDivisionError
: 0으로 나누려고 할 때 발생합니다.
파이썬에서 예외 처리하기
파이썬에서는 try-except 블록을 사용하여 예외를 처리합니다. 이 블록은 코드에서 예외가 발생할 수 있는 부분을 감싸고, 예외가 발생했을 때 대처할 로직을 제공합니다.
기본 try-except 구조
try:
# 잠재적으로 예외가 발생할 수 있는 코드
except SomeException:
# 예외가 발생했을 때 실행할 코드
이 구조에서는 try
블록 내의 코드가 실행됩니다. 만약 예외가 발생하면, try
블록의 나머지 코드는 무시되고 except
블록으로 넘어갑니다. 예외가 발생하지 않으면 except
블록은 무시됩니다.
여러 개의 except 블록 처리하기
여러 유형의 예외를 각각 다르게 처리하기 위해, 여러 개의 except
블록을 사용할 수 있습니다. 가장 일반적인 사용 예는 다음과 같습니다:
try:
# 예외가 발생할 수 있는 코드
except FirstException:
# FirstException을 처리하는 코드
except SecondException:
# SecondException을 처리하는 코드
except Exception as e:
# 모든 예외를 포괄하여 처리
이 구조에서는 발생한 예외의 유형에 따라 적합한 except
블록이 선택되어 실행됩니다.
else 블록 사용
try
블록의 코드가 예외 없이 성공적으로 실행되었을 때, else
블록이 실행됩니다. 이는 예외가 발생하지 않을 경우에만 실행되고자 하는 코드를 else
블록에 넣는 데 유용합니다. 예제:
try:
result = x / y
except ZeroDivisionError:
print("Cannot divide by zero!")
else:
print("Division successful, result:", result)
finally 블록 사용
finally
블록은 예외 발생 여부와 상관없이 try
문이 종료될 때 항상 실행됩니다. 보통 정리 작업(Cleanup)을 수행하는 데 사용됩니다.
try:
file = open('data.txt')
# 파일에서 작업을 수행
except FileNotFoundError:
print("File not found!")
finally:
file.close()
위 코드는 예외 발생 여부와 상관없이 파일을 닫습니다.
사용자 정의 예외
개발자는 필요에 따라 사용자 정의 예외를 만들 수 있습니다. 이는 표준 예외 클래스인 Exception
을 상속받아 새로운 예외 클래스를 정의하는 방식으로 수행됩니다.
사용자 정의 예외 클래스 만들기
class CustomException(Exception):
pass
def some_function(x):
if x < 0:
raise CustomException("Negative value not allowed!")
이 예제에서는 CustomException
이라는 사용자 정의 예외를 만들고, 특정 조건에서 이 예외가 발생하도록 설정하였습니다.
사용자 정의 예외의 고급 사용
사용자 정의 예외 클래스에 추가적인 정보를 제공하기 위해 생성자를 재정의하곤 합니다.
class DetailedException(Exception):
def __init__(self, message, value):
super().__init__(message)
self.value = value
이 클래스는 예외 메시지와 추가적인 값을 포함하여 예외 처리를 더욱 유연하게 만듭니다.
결론
파이썬의 예외 처리는 프로그램의 안정성을 높이고, 예기치 않은 상황에서도 프로그램이 의도한 대로 동작할 수 있도록 도와줍니다. 예외 처리는 단순히 오류를 감지하는 것에 그치지 않고, 적절히 예외를 다루고 복구하는 방법을 제공하여, 소프트웨어의 유연성과 신뢰성을 개선하는 데 중요한 요소입니다. 본 글을 통해 파이썬에서의 예외 처리 방법 및 사용자 정의 예외 생성에 대한 이해가 깊어지길 바랍니다.