예외 처리(Exception Handling)는 프로그램 실행 중에 발생할 수 있는 예외 상황을 감지하고, 그에 대한 적절한 대응을 수행하는 프로그래밍 기법이다.
예외 처리는 프로그램의 안정성과 신뢰성을 향상시키는 데 중요한 역할을 한다. 예외 처리를 통해 예상치 못한 상황에 대처하고, 적절한 오류 메시지를 제공하여 디버깅과 유지보수를 용이하게 할 수 있다.
try-except 문
가장 일반적인 예외 처리 방법은 try-except 문을 사용하는 것이다. try 블록에서 예외가 발생할 수 있는 코드를 실행하고, 예외가 발생하면 except 블록으로 제어가 이동하여 예외를 처리한다.
try:
# 예외가 발생할 수 있는 코드
...
except ExceptionType:
# 예외 처리 코드
...
다중 예외 처리
여러 종류의 예외를 다른 방식으로 처리해야 할 때, except 블록을 여러 개 사용하여 다중 예외 처리를 할 수 있다.
try:
# 예외가 발생할 수 있는 코드
...
except ExceptionType1:
# 예외 처리 코드
...
except ExceptionType2:
# 예외 처리 코드
...
else 문
try 블록에서 예외가 발생하지 않은 경우에만 실행되는 else 블록을 사용할 수 있다. else 블록은 예외가 발생하지 않았을 때 추가적인 작업을 수행하는 데 유용하게 활용할 수 있다.
try:
# 예외가 발생할 수 있는 코드
...
except ExceptionType:
# 예외 처리 코드
...
else:
# 예외가 발생하지 않았을 때 실행되는 코드
...
finally 문
finally 블록은 예외 발생 여부와 상관없이 항상 실행되어야 하는 코드를 포함하며, 주로 자원 해제나 정리 작업을 위해 활용된다.
try:
# 예외가 발생할 수 있는 코드
...
except ExceptionType:
# 예외 처리 코드
...
finally:
# 항상 실행되는 코드
...
예외 정보 얻기
예외가 발생했을 때 해당 예외에 대한 정보를 얻을 수 있다.
except 블록에서 예외 객체를 변수에 할당하여 예외 정보에 접근할 수 있다.
try:
# 예외가 발생할 수 있는 코드
...
except ExceptionType as e:
# 예외 처리 코드
print("예외 발생:", e)
사용자 정의 예외
파이썬에서는 사용자가 직접 예외를 정의하여 사용할 수 있다. 이는 특정 상황에서 예외를 발생시켜 프로그램의 흐름을 제어하고 오류를 명확히 식별할 수 있게 해준다.
class CustomException(Exception):
pass
try:
if some_condition:
raise CustomException("Custom Exception Occurred!")
except CustomException as e:
# 예외 처리 코드
print("사용자 정의 예외 발생:", e)
예외 발생시키기
raise 키워드를 사용하여 의도적으로 예외를 발생시킬 수 있다. 이는 특정 조건이 충족되거나 예외 상황을 강제로 만들어야 할 때 유용하다.
def divide(a, b):
if b == 0:
raise ZeroDivisionError("나누는 수는 0이 될 수 없습니다.")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
# 예외 처리 코드
print("예외 발생:", e)
예외 처리의 계층 구조
파이썬은 예외 처리의 계층 구조를 가지고 있다. Exception 클래스가 모든 예외의 기본 클래스이며, 다양한 예외 클래스들이 이를 상속받아 사용된다. 이를 활용하여 예외 처리를 더 세분화하고 특정 예외에 대한 처리를 구체화할 수 있다.
try:
# 예외가 발생할 수 있는 코드
...
except ValueError:
# ValueError 예외 처리
...
except FileNotFoundError:
# FileNotFoundError 예외 처리
...
except Exception as e:
# 모든 예외 처리
...
예외 처리의 중첩
try-except 블록 안에 또 다른 try-except 블록을 사용하여 예외를 중첩시켜 처리할 수 있다.
try:
# 예외가 발생할 수 있는 코드
try:
# 중첩된 예외 처리
...
except ExceptionType1:
# 예외 처리 코드
...
except ExceptionType2:
# 예외 처리 코드
...