예외와 오류란 무엇인가?
프로그래밍을 하다 보면 다양한 이유로 프로그램이 중단되거나 예상치 못한 결과가 발생하는 경우가 있습니다. 이러한 상황을 “오류(Error)” 또는 “예외(Exception)“라고 합니다. 예외는 사용자의 잘못된 입력, 파일이 존재하지 않음, 네트워크 연결 오류 등 현실적인 문제로 인해 발생하는 경우가 많습니다.
예를 들어 다음 코드를 실행해 보면:
num = int(input("숫자를 입력하세요: "))
print(10 / num)
사용자가 0을 입력하면 “ZeroDivisionError: division by zero”라는 오류가 발생합니다. 이는 0으로 나눌 수 없다는 수학적 제약 때문에 생기는 예외입니다.
또한, 존재하지 않는 파일을 열려고 하면 다음과 같은 오류가 발생할 수 있습니다:
f = open("없는파일.txt", "r")
결과: FileNotFoundError: [Errno 2] No such file or directory
이처럼 예외는 프로그램의 예기치 못한 종료를 초래할 수 있으므로, 이를 적절히 처리하는 것이 중요합니다. 파이썬에서는 try-except 구문을 사용하여 예외 상황에 대응할 수 있습니다.
try-except 구문으로 오류 처리하기
파이썬에서 예외를 처리하는 기본 구조는 try-except입니다. 문제가 발생할 수 있는 코드를 try 블록에 넣고, 예외 발생 시 실행할 코드를 except 블록에 작성합니다.
try:
num = int(input("숫자를 입력하세요: "))
print(10 / num)
except ZeroDivisionError:
print("0으로는 나눌 수 없습니다.")
이 코드는 사용자가 0을 입력했을 때 프로그램이 중단되지 않고, 친절한 메시지를 출력하도록 처리합니다. except는 특정 예외만 처리할 수도 있고, 모든 예외를 포괄적으로 처리할 수도 있습니다:
try:
f = open("없는파일.txt", "r")
except FileNotFoundError:
print("파일이 존재하지 않습니다.")
except Exception as e:
print("기타 오류 발생:", e)
Exception은 대부분의 예외를 포함하는 상위 클래스이므로, 어떤 예외가 발생할지 모를 경우 사용하면 유용합니다.
예외 처리의 확장 (finally, raise 등)과 실습 예제
try-except 외에도 finally, else, raise 등 예외 처리를 보다 유연하게 만들어주는 키워드들이 있습니다.
1. finally 블록
finally는 예외 발생 여부와 관계없이 반드시 실행되는 코드 블록입니다. 파일 닫기, 네트워크 연결 해제 등 정리 작업에 자주 사용됩니다.
try:
f = open("data.txt", "r")
content = f.read()
except FileNotFoundError:
print("파일이 없습니다.")
finally:
print("프로그램 종료")
2. else 블록
else는 예외가 발생하지 않았을 때만 실행되는 코드입니다:
try:
num = int(input("숫자를 입력하세요: "))
except ValueError:
print("숫자를 입력해야 합니다.")
else:
print("입력하신 숫자는:", num)
3. raise로 사용자 정의 예외 발생시키기
필요한 경우 직접 예외를 발생시킬 수 있습니다. 조건에 맞지 않는 경우 강제로 오류를 일으켜서 로직을 중단하거나 사용자에게 경고할 수 있습니다:
def set_age(age):
if age < 0:
raise ValueError("나이는 0보다 작을 수 없습니다.")
print("나이 설정 완료:", age)
set_age(-5)
raise를 사용하여 ValueError를 직접 발생시켰습니다. 프로그램이 예외 상황에 대해 스스로 판단하고 대처할 수 있게 하는 방식입니다. 다음은 실습예제입니다.(계산기 프로그램에 예외 처리 추가하기)
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
return "0으로 나눌 수 없습니다."
try:
x = int(input("첫 번째 숫자: "))
y = int(input("두 번째 숫자: "))
result = divide(x, y)
print("결과:", result)
except ValueError:
print("숫자만 입력해야 합니다.")
숫자가 아닌 값을 입력하거나, 0으로 나누는 상황을 모두 예외 처리하여 프로그램이 중단되지 않도록 설계한 예제입니다.예외 처리는 프로그램의 신뢰성과 안정성을 높이는 데 필수적인 요소입니다. 초보자라도 try-except부터 시작해 finally, else, raise까지 익혀두면 실제 프로그램을 만들 때 오류에 유연하게 대처할 수 있습니다.