본문으로 바로가기
TaeyoungKim.dev

Python try·except·else·finally 실행 순서: 성공과 오류 때 무엇이 실행될까?

파이썬작성 약 3분 읽기TaeyoungKim
LinkedInX

입력값을 숫자로 바꾸는 코드에서 오류가 나도 마지막 정리 문구는 출력된다. 그런데 정상일 때만 해야 하는 계산을 finally에 넣었다가 오류가 난 값으로 다시 계산하려 한다. try, except, else, finally는 모두 예외 처리 주변에 있지만 실행 조건이 다르다. 작은 입력 두 개로 경로를 나눠 보면 헷갈림이 줄어든다.

try와 except는 성공·실패 경로를 나눈다

도식에서 try의 성공선은 else로, 예상한 오류선은 except로 갈라진다. 두 선이 다시 finally에 모이는 모습은 결과와 관계없이 공통 정리 작업을 수행한다는 뜻이다.

try에는 실패할 수 있는 변환을 넣고, 예상한 예외는 해당 except에서 처리한다. 문자열 '12'는 정수로 바뀌지만 '열둘'은 ValueError가 난다.

python
def parse_count(raw):
    try:
        count = int(raw)
    except ValueError:
        print('숫자를 입력해 주세요')
        return None
    else:
        return count * 2
    finally:
        print('입력 확인 종료')

print(parse_count('12'))
print(parse_count('열둘'))

첫 호출은 else에서 24를 만들고 finally를 거친 뒤 24가 출력된다. 두 번째 호출은 오류 안내를 출력하고 None을 반환하려 하지만, 반환 전에 finally가 실행된다. 화면에는 입력 확인 종료가 두 호출에서 모두 보인다. finally가 실행됐다고 해서 실패가 성공으로 바뀐 것은 아니다.

else와 finally는 언제 필요한가?

else는 try에서 예외가 나지 않았을 때만 실행된다. 정상적으로 변환된 값에 대한 후속 계산을 두면, 변환 자체에서 난 오류와 후속 계산에서 난 오류를 구분하기 좋다. 반면 finally는 정상 경로와 예외 경로가 끝날 때 공통으로 실행할 정리 동작을 두는 자리다.

정리 코드가 새 예외를 내거나 finally에서 다시 return하면 원래 오류나 반환값을 가릴 수 있다. 따라서 finally에 핵심 계산 결과를 덮어쓰는 코드를 넣지 말고, 꼭 필요한 정리만 둔다. 파일·연결을 닫는 작업처럼 자원 관리가 목적이라면 with 문이 더 적절한지도 검토한다.

오류를 재현할 때 무엇을 확인할까?

정상 입력과 오류 입력을 각각 한 번 실행하고 출력 순서를 비교한다. except ValueError는 숫자 변환 실패만 처리한다. 다른 곳에서 발생한 TypeError까지 이 블록이 조용히 삼키지는 않는다. except Exception으로 모든 오류를 넓게 받으면 예상하지 못한 버그까지 입력 오류처럼 보일 수 있으므로, 어떤 오류를 사용자가 고칠 수 있는지 먼저 정한다.

반환값 None이 정상적인 값과 구별돼야 하는 경우에는 호출 쪽에서 명시적으로 검사한다. if not result는 0도 실패처럼 취급할 수 있다. 오류가 났을 때 로그를 남긴다면 입력값에 비밀번호나 개인정보가 들어 있지 않은지도 확인한다. 예외를 처리하는 일과 민감한 데이터를 안전하게 다루는 일은 별개의 판단이다.

핵심 요약: 성공·오류·공통 정리를 구분한다

try는 실패할 수 있는 코드, except는 예상한 오류, else는 오류가 없을 때의 후속 작업, finally는 두 경로 모두의 정리에 쓴다. 실행 순서가 헷갈릴 때는 정상 입력과 오류 입력을 같은 함수에 넣어 출력과 반환값을 나란히 확인하자.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#Python#try#except#else#finally

함께 읽으면 좋은 글