본문 바로가기
C.W.K.
Stream
Lesson 01 of 06 · published

try의 네 절 — 실패 범위와 정리를 나누기

~20 min · try, except, else, finally

Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete

위험한 연산만 try에 넣어

except는 위에서부터 처음 맞는 예외 타입을 처리해. try 범위를 넓히면 뒤쪽 프로그래밍 오류까지 예상한 실패로 오해할 수 있어.

else와 finally는 역할이 다르다

else는 try가 예외 없이 끝난 뒤 실행되어 성공 뒤 작업을 분리하고, finally는 성공·실패·반환과 관계없이 정리를 맡아. finally의 return이나 새 예외가 원래 실패를 가리지 않게 작게 유지해.

타입 없는 except:는 KeyboardInterrupt와 SystemExit까지 잡으므로 피하고, 회복할 수 있는 가장 좁은 타입을 골라.

Code

try·except·else·finally의 역할·python
def parse_int(s):
    try:
        result = int(s)
    except ValueError:
        print("파싱 못 함")
        return None
    else:
        print("파싱 성공")
        return result
    finally:
        print("항상 실행 (cleanup, logging 등)")

print(parse_int("42"))
# 파싱 성공
# 항상 실행 (cleanup, logging 등)
# 42

print(parse_int("숫자 아님"))
# 파싱 못 함
# 항상 실행 (cleanup, logging 등)
# None
여러 except에서 첫 일치가 이긴다·python
def lookup(d, key):
    try:
        return int(d[key])
    except KeyError:
        return f"키 {key!r} 없음"
    except ValueError:
        return f"키 {key!r} int 아님"
    except TypeError:
        return f"d 가 dict 아님"

print(lookup({"a": "42"}, "a"))      # 42
print(lookup({"a": "42"}, "b"))      # 키 'b' 없음
print(lookup({"a": "x"}, "a"))       # 키 'a' int 아님
print(lookup(None, "a"))             # d 가 dict 아님

# 타입 tuple — 한 except 가 여러 처리
try:
    pass
except (KeyError, ValueError) as e:
    print(type(e).__name__, e)
else로 예외 처리 범위 좁히기·python
# else 없이 — 위험
def bad(file_path):
    try:
        with open(file_path) as f:
            data = f.read()
            print("파일 크기:", len(data))      # 이게 실패하면 except 가 잡음
            value = int(data)                    # 이것도
    except FileNotFoundError:
        print("파일 없음")
    except ValueError:
        print("잘못된 숫자")
    # print() 또는 len() 의 버그도 잡힘 — 조용히 삼킴

# else 로 — except 가 진짜 위험한 연산만 잡음
def good(file_path):
    try:
        with open(file_path) as f:
            data = f.read()
    except FileNotFoundError:
        print("파일 없음")
        return
    else:
        print("파일 크기:", len(data))
        value = int(data)                       # 이게 실패하면 안 잡힘
        return value
타입 없는 except를 피해야 하는 이유·python
# 안 좋음
try:
    risky()
except:                       # bare except
    pass                      # Ctrl+C 포함 모든 거 삼킴

# 좋음 — Exception 이 가장 넓은 합리적
try:
    risky()
except Exception as e:
    print("잡음:", type(e).__name__, e)

# 더 좋음 — 진짜 기대하는 거로 좁힘
try:
    risky()
except (ValueError, KeyError) as e:
    print("기대된 실패:", e)
# 다른 예외는 위로 전파 — 그게 맞음

External links

Exercise

safe_divide(a, b)를 만들어 TypeError는 'bad types', ZeroDivisionError는 a의 부호에 따라 양·음의 무한대나 0.0으로 처리해. 성공했을 때 else에서 success를, finally에서 attempted를 출력하고 네 입력 이상 시험해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.