프로그래밍을 하다 보면 의도치 않게 발생하는 오류와 마주치는 경우가 많습니다. 이러한 오류가 발생했을 때, 프로그램이 갑자기 종료되는 것을 방지하고 사용자에게 적절한 알림을 제공하는 것이 예외 처리의 주요 목적입니다. 이번 포스트에서는 파이썬에서의 예외 처리에 대해 알아보겠습니다.

예외 처리란 무엇인가요?
예외 처리란 코드 실행 중에 발생할 수 있는 오류를 관리하는 방법으로, 프로그램의 정상적인 흐름을 방해하지 않고도 오류를 처리할 수 있도록 도와줍니다. 파이썬에서는 try, except, else, finally와 같은 키워드를 사용하여 예외 처리를 구현합니다. 이렇게 함으로써 프로그램이 더 안정적으로 작동할 수 있도록 할 수 있습니다.
예외의 종류
프로그램에서 발생할 수 있는 예외는 다양합니다. 일반적으로 발생하는 예외 유형은 다음과 같습니다:
- ZeroDivisionError: 0으로 나누려고 할 때 발생합니다.
- IndexError: 리스트의 범위를 넘는 인덱스에 접근하려 할 때 발생합니다.
- KeyError: 딕셔너리에서 존재하지 않는 키를 참조할 때 발생합니다.
- ValueError: 함수에 잘못된 값이 전달될 때 발생합니다.
- TypeError: 잘못된 데이터 타입으로 연산을 시도할 때 발생합니다.
파이썬의 기본 예외 처리 구문
파이썬에서는 try-except 문을 통해 예외를 처리할 수 있습니다. 기본적인 구조는 다음과 같습니다:
try:
# 실행할 코드
except 예외이름:
# 예외 발생 시 실행할 코드
try 블록 안에 있는 코드를 실행하다가 예외가 발생하면, 즉시 except 블록으로 넘어가 해당 예외를 처리합니다. 경우에 따라 예외가 발생하지 않았다면, except 블록은 실행되지 않습니다.
예외 처리의 예
try:
x = int(input('숫자를 입력하세요: '))
result = 10 / x
print(f'결과: {result}')
except ZeroDivisionError:
print('0으로 나눌 수 없습니다.')
except ValueError:
print('유효한 정수를 입력하세요.')
위의 코드에서는 사용자가 입력한 숫자에 따라 결과를 계산합니다. 만약 사용자가 0을 입력하면 ZeroDivisionError가 발생하고, 잘못된 데이터 타입을 입력한다면 ValueError가 발생하여 각 예외에 대한 메시지를 출력하게 됩니다.
다양한 예외 유형 처리하기
한 개의 try 블록에서 여러 예외를 처리할 수 있습니다. 이러한 경우 각 예외에 대해 별도의 except 블록을 사용할 수 있습니다. 사용자가 입력한 값을 바탕으로 여러 조건을 처리하는 코드는 다음과 같습니다:
try:
a = int(input('제수를 입력하세요: '))
b = int(input('피제수를 입력하세요: '))
result = a / b
print(f'{a} / {b} = {result}')
except ZeroDivisionError:
print('0으로 나눌 수는 없습니다.')
except ValueError:
print('정수를 입력해야 합니다.')
이 예제에서도 사용자가 입력한 값에 따라 다르게 반응하도록 설계되어 있습니다. ZeroDivisionError와 ValueError를 각각 처리하여 사용자에게 적합한 에러 메시지를 제공합니다.
else 문과 finally 문 활용하기
예외 처리 구문에서 else 블록과 finally 블록도 유용하게 사용할 수 있습니다.
else 블록
try 블록 안에서 예외가 발생하지 않았을 경우 실행되는 코드 블록입니다. 예외가 없을 때만 실행되어야 할 코드를 작성할 수 있도록 합니다. 아래는 그 예입니다:
try:
x = int(input('숫자를 입력하세요: '))
print(f'입력한 숫자의 제곱: {x ** 2}')
except ValueError:
print('유효한 숫자를 입력하세요.')
else:
print('입력이 성공적으로 처리되었습니다.')
finally 블록
finally 블록은 예외 발생 여부와 관계없이 항상 실행되는 코드를 포함합니다. 주로 리소스를 정리하거나 종료 작업을 수행할 때 사용됩니다. 다음은 예시입니다:
try:
file = open('example.txt', 'r')
content = file.read()
print(content)
except FileNotFoundError:
print('파일을 찾을 수 없습니다.')
finally:
file.close() # 파일을 반드시 닫습니다.
위의 예제에서 파일이 정상적으로 열리면 내용을 읽고 출력하며, 예외가 발생하더라도 마지막에는 file을 닫는 작업이 실행됩니다.
사용자 정의 예외 클래스 만들기
개발자가 직접 예외를 정의할 수도 있습니다. 사용자 정의 예외는 Exception 클래스를 상속받아 구현할 수 있으며, 특정 상황을 더 깔끔하게 처리할 수 있습니다. 예를 들어:
class MyCustomError(Exception):
pass
try:
raise MyCustomError('사용자 정의 예외가 발생했습니다.')
except MyCustomError as e:
print(e)
위의 코드는 MyCustomError라는 예외를 사용자 정의하여 발생시키고, 이를 예외 처리하는 과정입니다.

결론
파이썬에서 예외 처리는 프로그램을 보다 안정적으로 만들기 위한 필수 요소입니다. 다양한 방법으로 오류를 관리하고 사용자에게 알림을 줄 수 있는 예외 처리 기술을 통해, 개발자들은 더 나은 프로그램을 만들 수 있게 됩니다. 예외 처리 문법을 활용하여 사용자의 경험을 향상시키고, 예기치 않은 상황에서도 안정적인 실행이 가능하도록 노력해 보시기 바랍니다.
자주 찾는 질문 Q&A
파이썬에서 예외 처리를 하는 이유는 무엇인가요?
파이썬의 예외 처리는 프로그램이 비정상적으로 종료되는 것을 예방하고 사용자에게 오류를 알리는 역할을 합니다. 이를 통해 코드의 안정성을 높이고 더 나은 사용자 경험을 제공합니다.
예외 처리에서 try와 except의 차이는 무엇인가요?
try 블록은 실행할 코드를 포함하고, 해당 블록에서 오류가 발생하면 except 블록으로 넘어가서 오류를 처리합니다. 이 구조를 통해 코드의 흐름을 끊김 없이 유지할 수 있습니다.
사용자 정의 예외 클래스는 어떻게 만들 수 있나요?
개발자는 Exception 클래스를 상속하여 자신만의 예외를 정의할 수 있습니다. 이를 통해 특정 상황에 맞는 커스터마이즈된 오류 처리를 쉽게 구현할 수 있습니다.