개발/python

파이썬 예외 처리: 오류가 나도 프로그램이 멈추지 않게 하는 방법

notebase 2026. 5. 22. 08:32

파이썬 예외 처리의 기본 구조와 try, except, else, finally 사용법을 초보자 기준 예제로 정리합니다.

 

파이썬 예외 처리는 프로그램 실행 중 발생할 수 있는 오류를 안전하게 처리하는 방법입니다. 파일이 없거나, 숫자로 바꿀 수 없는 값이 들어오거나, 0으로 나누는 상황에서 프로그램이 바로 종료되지 않도록 도와줍니다.

코드를 작성하다 보면 오류는 피할 수 없습니다. 중요한 것은 오류가 났을 때 프로그램이 어떻게 반응하게 할지 정하는 것입니다.

오류와 예외는 무엇이 다를까

파이썬에서 오류는 크게 두 가지로 나눠볼 수 있습니다.

첫 번째는 문법 오류입니다.

print("안녕하세요"

괄호를 닫지 않았기 때문에 코드 자체가 실행되지 않습니다. 이런 오류는 실행 전에 고쳐야 합니다.

두 번째는 실행 중 발생하는 예외입니다.

number = int("abc")

문법은 맞지만 "abc"는 숫자로 바꿀 수 없습니다. 이 코드는 실행 중 ValueError가 발생합니다.

예외 처리는 주로 이런 실행 중 오류를 다룹니다.

예외 처리가 필요한 이유

사용자에게 숫자를 입력받는 코드를 생각해보겠습니다.

age = int(input("나이를 입력하세요: "))
print(age + 1)

사용자가 20을 입력하면 문제없이 동작합니다. 하지만 스무살이라고 입력하면 오류가 발생하고 프로그램이 종료됩니다.

이런 상황에서 예외 처리를 사용합니다.

try:
    age = int(input("나이를 입력하세요: "))
    print(age + 1)
except ValueError:
    print("숫자로 입력해야 합니다.")

사용자가 숫자가 아닌 값을 입력해도 프로그램이 바로 종료되지 않고 안내 문구를 출력합니다.

try except 기본 구조

예외 처리의 기본 구조는 다음과 같습니다.

try:
    예외가 발생할 수 있는 코드
except 예외종류:
    예외가 발생했을 때 실행할 코드

예제를 보겠습니다.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

실행 결과는 다음과 같습니다.

0으로 나눌 수 없습니다.

10 / 0은 실행할 수 없는 계산입니다. 그래서 ZeroDivisionError가 발생합니다.

이때 except ZeroDivisionError 아래 코드가 실행됩니다.

여러 예외 처리하기

하나의 코드에서 여러 종류의 예외가 발생할 수 있습니다.

try:
    number = int(input("숫자를 입력하세요: "))
    result = 10 / number
    print(result)
except ValueError:
    print("숫자만 입력할 수 있습니다.")
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")

이 코드는 두 가지 예외를 처리합니다.

  • 숫자로 바꿀 수 없는 값이 들어오면 ValueError
  • 0을 입력하면 ZeroDivisionError

예외 종류를 나눠 쓰면 사용자에게 더 정확한 안내를 할 수 있습니다.

모든 예외를 한 번에 처리할 수도 있다

아래처럼 예외 종류를 쓰지 않고 처리할 수도 있습니다.

try:
    number = int(input("숫자를 입력하세요: "))
    print(10 / number)
except:
    print("오류가 발생했습니다.")

하지만 이 방식은 주의해야 합니다. 어떤 오류가 발생했는지 알기 어렵기 때문입니다.

초보 단계에서도 가능한 한 구체적인 예외 이름을 쓰는 습관이 좋습니다.

권장되는 방식은 다음과 같습니다.

try:
    number = int(input("숫자를 입력하세요: "))
    print(10 / number)
except ValueError:
    print("숫자만 입력해주세요.")
except ZeroDivisionError:
    print("0은 입력할 수 없습니다.")

예외 메시지 확인하기

예외가 발생했을 때 파이썬이 제공하는 메시지를 확인할 수도 있습니다.

try:
    number = int("abc")
except ValueError as e:
    print("오류 내용:", e)

이 방식은 오류 원인을 확인할 때 유용합니다.

else 사용하기

else는 예외가 발생하지 않았을 때 실행됩니다.

try:
    number = int(input("숫자를 입력하세요: "))
except ValueError:
    print("숫자로 입력해야 합니다.")
else:
    print("입력한 숫자:", number)

예외가 발생하면 except가 실행됩니다. 예외가 발생하지 않으면 else가 실행됩니다.

성공했을 때 실행할 코드를 분리하고 싶다면 사용할 수 있습니다.

finally 사용하기

finally는 예외 발생 여부와 상관없이 항상 실행됩니다.

try:
    file = open("sample.txt", "r", encoding="utf-8")
    content = file.read()
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
finally:
    print("작업을 종료합니다.")

파일을 찾든 찾지 못하든 finally 아래 코드는 실행됩니다.

실무에서는 파일 닫기, 연결 종료, 임시 작업 정리처럼 반드시 실행해야 하는 코드를 넣을 때 사용합니다.

다만 파일을 다룰 때는 보통 with 문을 더 자주 사용합니다. 파일 입출력 글에서 따로 다루는 것이 좋습니다.

raise로 예외 직접 발생시키기

필요한 경우 개발자가 직접 예외를 발생시킬 수도 있습니다.

def check_age(age):
    if age < 0:
        raise ValueError("나이는 음수가 될 수 없습니다.")
    return age

print(check_age(20))
print(check_age(-1))

age가 음수라면 ValueError를 직접 발생시킵니다.

이 방식은 잘못된 값이 들어왔을 때 코드 흐름을 강제로 중단하고 싶을 때 사용합니다.

초보 단계에서는 “조건에 맞지 않는 값이 들어오면 예외를 직접 만들 수도 있다” 정도로 이해하면 충분합니다.

자주 발생하는 예외 종류

예외 이름 발생 상황
ValueError 값의 형태가 맞지 않을 때
TypeError 자료형이 맞지 않을 때
ZeroDivisionError 0으로 나누려고 할 때
IndexError 리스트 인덱스 범위를 벗어날 때
KeyError 딕셔너리에 없는 키를 사용할 때
FileNotFoundError 파일을 찾을 수 없을 때

예외 이름을 모두 외울 필요는 없습니다. 자주 만나는 오류부터 하나씩 익히면 됩니다.

예외 처리를 너무 넓게 쓰지 않기

예외 처리는 편리하지만, 모든 코드를 감싸는 방식으로 쓰면 좋지 않습니다.

try:
    # 아주 많은 코드
    pass
except Exception:
    print("오류 발생")

이런 코드는 어디에서 문제가 생겼는지 찾기 어렵습니다.

예외 처리는 “오류가 발생할 가능성이 있는 부분”에만 좁게 적용하는 편이 좋습니다.

정리

파이썬 예외 처리는 실행 중 발생하는 오류를 안전하게 다루는 방법입니다.

기본 구조는 tryexcept입니다. 예외가 발생할 수 있는 코드는 try에 넣고, 오류가 발생했을 때 실행할 코드는 except에 넣습니다.

가능하면 구체적인 예외 이름을 사용하고, 예외 처리 범위는 너무 넓게 잡지 않는 것이 좋습니다.

처음에는 ValueError, ZeroDivisionError, FileNotFoundError처럼 자주 만나는 예외부터 익히면 충분합니다.