Application/Python

[Python] 파이썬 예외처리, try except로 오류 잡는 법

devsalix 2026. 5. 6. 08:26
728x90

파이썬 예외처리, try except로 오류 잡는 법

지난 글에서 파일 읽기를 연습하다가, 파일 이름을 살짝 잘못 적은 적 있으시죠. 그 순간 화면이 빨간 글자로 뒤덮이면서 FileNotFoundError가 떴을 거예요.

처음엔 그게 진짜 당황스럽거든요. 코드를 다 맞게 짠 것 같은데 빨간 메시지가 좌악 뜨면, "내가 또 뭘 잘못했지?" 싶고요.

그런데 사실 저런 빨간 글자, 꼭 여러분 잘못이 아닐 때가 더 많아요.


파이썬 오류는 왜 생길까요

프로그램은 보통 위에서 아래로 한 줄씩 실행돼요. 그런데 가끔 예상 못한 상황을 만나면 거기서 멈춰버려요. 없는 파일을 열려고 했다거나, 0으로 나누려고 했다거나, 사용자가 숫자 칸에 글자를 넣었다거나요.

이런 걸 예외(Exception) 라고 부릅니다. 에러랑 거의 같은 말이에요.

print("프로그램 시작")  # 이건 잘 출력됨
숫자 = 10 / 0  # 여기서 ZeroDivisionError 발생
print("프로그램 끝")  # 이 줄은 영영 실행 안 됨

 

실행 결과:

프로그램 시작
ZeroDivisionError: division by zero

 

보세요. 마지막 줄은 영원히 못 봐요. 한 번 에러가 나면 그 뒤는 통째로 날아가는 거죠.


try except, 코드용 우산이라고 생각하세요

밖에 나갈 때 비가 올지 안 올지 모르면 우산을 챙기잖아요. 안 오면 안 펴면 되고, 오면 펴면 되고요.

try/except도 똑같아요. "여기서 에러 날 수도 있는데, 만약 나면 이렇게 대처해줘" 하고 미리 우산을 챙겨두는 거예요.

print("프로그램 시작")
try:
    숫자 = 10 / 0  # 에러가 날 수도 있는 줄
except ZeroDivisionError:
    print("0으로 나눌 수 없어요")  # 에러가 나면 여기 실행
print("프로그램 끝")  # 이번엔 정상 출력!

 

실행 결과:

프로그램 시작
0으로 나눌 수 없어요
프로그램 끝

 

프로그램이 안 죽고 끝까지 갔어요. 이게 핵심이에요.


python try except 기본 문법

구조는 이렇게 생겼어요.

try:
    위험한_코드
except 예외종류:
    대처할_코드

 

try 블록 안에서 에러가 나면 except 쪽으로 점프하고, 에러가 안 나면 except는 그냥 건너뜁니다. 어느 쪽이든 프로그램은 계속 굴러가요.


except 뒤에 예외 종류, 꼭 적어주세요

이 부분이 진짜 중요한데요. 가끔 이렇게 쓰는 분들이 있어요.

try:
    위험한_코드()
except:  # 모든 에러를 다 잡아버림
    pass

 

편해 보이지만 정말 위험한 습관이에요. 화재경보기를 통째로 꺼버리는 거랑 똑같거든요. 작은 불도, 큰 불도 다 모르게 돼요.

나중에 진짜 심각한 버그가 났을 때 어디서 뭐가 잘못됐는지 추적이 안 돼요. 꼭 잡고 싶은 예외 이름을 정확히 적어주세요. 이 습관 하나가 나중에 디버깅 지옥에서 여러분을 구해줍니다.

try:
    숫자 = int("스물")  # ValueError 발생
except ValueError as e:
    print(f"문제가 생겼어요: {e}")

 

실행 결과:

문제가 생겼어요: invalid literal for int() with base 10: '스물'

 

as e를 쓰면 에러 메시지를 받아볼 수 있어요. 디버깅할 때 정말 유용합니다.


자주 만나는 파이썬 오류 종류

초보자가 자주 만나는 예외만 모아봤어요.

  • ValueError: 값 형식이 안 맞을 때 (int("hello"))
  • TypeError: 타입이 안 맞을 때 ("5" + 3)
  • ZeroDivisionError: 0으로 나눌 때
  • FileNotFoundError: 파일이 없을 때
  • KeyError: 딕셔너리에 그 키가 없을 때
  • IndexError: 리스트 범위를 벗어났을 때

여러 예외를 한 번에 처리하기

except를 여러 개 이어 쓸 수 있어요.

try:
    a = int(input("위 숫자: "))
    b = int(input("아래 숫자: "))
    print(f"결과: {a / b}")
except ValueError:
    print("숫자만 입력해 주세요")
except ZeroDivisionError:
    print("0으로는 나눌 수 없어요")

 

상황에 따라 다른 메시지를 보여줄 수 있어서 사용자한테 훨씬 친절해지죠.


finally는 무조건 실행되는 마무리

finally는 에러가 나든 안 나든 무조건 실행되는 블록이에요.

try:
    파일 = open("data.txt")
    내용 = 파일.read()
except FileNotFoundError:
    print("파일이 없어요")
finally:
    print("어쨌든 이건 실행됨")

 

주로 자원 정리(파일 닫기 같은 것)에 씁니다. 사실 파일은 with문이 더 편하긴 한데, "이런 게 있다" 정도만 알아두시면 돼요.


실용 패턴: 안전하게 숫자 입력받기

실제로 정말 자주 쓰는 패턴이에요.

def 정수_입력받기(질문):
    while True:
        try:
            return int(input(질문))  # 성공하면 함수 종료
        except ValueError:
            print("숫자만 입력해 주세요. 다시!")

나이 = 정수_입력받기("나이를 입력하세요: ")
print(f"{나이}살이시군요")

 

사용자가 "스물"이라고 적든, 빈 칸으로 엔터를 치든, 프로그램이 안 죽고 다시 물어봐요. 이거 한 번 만들어두면 어디서나 가져다 쓸 수 있습니다.


실습: 안전한 나눗셈 계산기

직접 한번 만들어 보세요.

while True:
    try:
        a = int(input("위 숫자: "))
        b = int(input("아래 숫자: "))
        print(f"결과: {a / b}")
        break  # 성공하면 반복 종료
    except ValueError:
        print("숫자만 입력하세요. 다시 해볼게요.")
    except ZeroDivisionError:
        print("0으로는 나눌 수 없어요. 다시 해볼게요.")

 

글자를 넣어도, 0을 넣어도 절대 안 죽는 계산기예요. 직접 돌려보시면서 일부러 이상한 값을 넣어보세요. 안 죽는 게 신기하실 거예요.

에러는 여러분 잘못이 아니에요. 사용자가 이상한 값을 넣을 수도 있고, 파일이 갑자기 사라질 수도 있고요. 그런 상황을 미리 예상하고 대비해두는 게 진짜 실력입니다.

이제 입력도 안전하게 받을 줄 알게 됐으니, 다음에는 지금까지 배운 걸 다 합쳐서 진짜 작은 프로그램 하나를 만들어볼 거예요. 간단한 계산기인데, 여러분이 직접 손대서 키워볼 수 있는 첫 미니 프로젝트가 될 거예요.


 


제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀

 

 
728x90