68 — 예외: 문제 다루기
파일이 없거나 숫자가 아닌 줄을 만나면 프로그램은 그 자리에서 멈춥니다.
try / except가 그 문제를 잡아 친절한 대신 내용을 실행합니다.
단계
- 없는 파일은
파일읽기가FileNotFoundError를 일으키게 합니다.except블록이 멈추는 대신 실행됩니다:
실행해 보기 →파일 사용 최신 try: 내용 = 파일읽기("notes.txt") except FileNotFoundError: "notes.txt 파일이 없어요." 말해줘 int()는일곱같은 입력에서ValueError를 일으킵니다.except뒤의else는 아무 문제가 없었을 때만 실행됩니다:
실행해 보기 →답을 물어봐 "두 배로 만들 숫자: " try: 숫자 = int(답) except ValueError: "그건 숫자가 아니에요." 말해줘 else: f"두 배는 {숫자 * 2}입니다." 말해줘- 전체 프로그램은 없을 수도 있는 파일을 읽고, 숫자를 물어봐 답이 바뀔 때까지 다시 묻습니다. 먼저
notes.txt를 두 줄로 만드세요:
실행해 보기 →# 안전읽기.nme — 없는 파일이어도 안전하게 읽습니다. # 실행: nme 실행 안전읽기 # try / except는 데이터가 나빠도 프로그램이 멈추지 않게 합니다. 파일 사용 최신 이름을 물어봐 "읽을 문서 이름을 입력하세요: " try: 내용 = 파일읽기(이름) except FileNotFoundError: "그 문서는 아직 없어요." 말해줘 "먼저 file_write로 만든 뒤 다시 실행하세요." 말해줘 else: f"{len(내용)}글자를 읽었어요." 말해줘 f"단어는 {len(내용.split())}개예요." 말해줘 줄들 = 내용.splitlines() f"첫 줄은: {줄들[0]}" 말해줘 "내용:" 말해줘 내용 보여줘 "이제 두 배로 만들 숫자를 주세요." 말해줘 계속 = True 동안 계속: 답을 물어봐 "두 배로 만들 숫자: " try: 숫자 = int(답) except ValueError: f"'{답}'은(는) 숫자가 아니에요 — 다시 주세요." 말해줘 else: 계속 = False f"두 배는 {숫자 * 2}입니다." 말해줘 - 파일이 있는 상태에서 실행합니다:
printf 'notes.txt\n일곱\n12\n' | nme 실행 안전읽기읽을 문서 이름을 입력하세요: 30글자를 읽었어요. 단어는 6개예요. 첫 줄은: Today is sunny. 내용: Today is sunny. We study NME. 이제 두 배로 만들 숫자를 주세요. 두 배로 만들 숫자: '일곱'은(는) 숫자가 아니에요 — 다시 주세요. 두 배로 만들 숫자: 두 배는 24입니다.없는 파일 이름으로 실행합니다:
printf 'nope.txt\n12\n' | nme 실행 안전읽기읽을 문서 이름을 입력하세요: 그 문서는 아직 없어요. 먼저 file_write로 만든 뒤 다시 실행하세요. 이제 두 배로 만들 숫자를 주세요. 두 배로 만들 숫자: 두 배는 24입니다. - 그냥
except:대신 이름 있는 오류(FileNotFoundError,ValueError)를 잡으세요. 진짜 버그는 크게 드러나야 합니다.
직접 해보기
json읽기로 JSON 파일을 읽고 json.JSONDecodeError를 잡아 보거나, 숫자 반복을 두 숫자를 더하는 것으로 바꿔 보세요.
배운 것
try:가 위험한 코드를 실행하고,except 어떤오류:가 바로 그 오류만 잡습니다.FileNotFoundError는 파일이 없을 때,ValueError는int()가 바꾸지 못할 때 생깁니다.except뒤의else:는 오류가 없었을 때만 실행됩니다.- 이름 있는 오류를 잡으세요. 뜻밖의 버그는 크게 드러나야 합니다.