6단원 과제 정답: 예외 처리 & 파일 처리¶
문제 1. try / except 기본¶
① 결과: 5.0
② 완료
③ ---
④ 0으로 나눌 수 없습니다.
⑤ 완료
해설
safe_divide(10, 2):
1. result = 10 / 2 = 5.0 — 오류 없음
2. else 블록 실행 → 결과: 5.0
3. finally 블록 → 완료
safe_divide(10, 0):
1. 10 / 0 → ZeroDivisionError
2. except 블록 → 0으로 나눌 수 없습니다.
3. finally 블록은 항상 실행 → 완료
문제 2. 다중 except¶
① 20.0
② 숫자 아님
③ 0 불가
④ 25.0
해설
| 호출 | 흐름 | 결과 |
|---|---|---|
convert("5") |
int("5")=5, 100/5=20.0 |
20.0 |
convert("hello") |
int("hello") → ValueError |
"숫자 아님" |
convert("0") |
int("0")=0, 100/0 → ZeroDivisionError |
"0 불가" |
convert("4") |
int("4")=4, 100/4=25.0 |
25.0 |
문제 3. raise 사용¶
① 85
② 오류: 점수 범위 초과: 110
③ 70
④ 오류: 점수 범위 초과: -5
해설
raise ValueError(...) — 조건이 맞으면 직접 예외를 발생시킵니다.
for 루프 안의 try/except가 각 호출마다 예외를 잡아 처리합니다.
문제 4. 파일 쓰기 모드 차이¶
실행 2 직후 log.txt 내용 ②:
첫 번째
두 번째
세 번째
최종 log.txt 내용 ①:
초기화
해설
| 실행 | 모드 | 결과 |
|---|---|---|
| 실행 1 | "w" |
새 파일 생성 → "첫 번째\n두 번째\n" |
| 실행 2 | "a" |
기존 내용 유지 + "세 번째\n" 추가 |
| 실행 3 | "w" |
기존 내용 삭제 후 "초기화\n"만 남음 |
문제 5. 파일 읽기¶
① 3
② apple
③ cherry
④ 1: apple
⑤ 2: banana
⑥ 3: cherry
해설
readlines()는 각 줄을 원소로 가지는 리스트를 반환합니다.
"apple\n", "banana\n", "cherry\n" — 각 줄에 \n 포함.
strip()으로 \n 제거 후 출력합니다.
문제 6. FileNotFoundError 처리¶
① hello
② b.txt: 없음
③ world
④ 완료
해설
각 파일 열기를 독립적인 try/except로 처리하므로, b.txt에서 예외가 발생해도 루프가 계속됩니다.
루프 종료 후 "완료" 출력.
문제 7. 예외 처리 흐름 완전 분석¶
① 결과: 5
② 성공
③ x=2 완료
④ ---
⑤ ValueError: zero!
⑥ x=0 완료
⑦ ---
⑧ 결과: -5
⑨ 성공
⑩ x=-2 완료
실제 출력은 9줄 + "---" 2줄 = 11줄이지만, 문제는 9개 빈칸 제공.
해설
test(2): 10 // 2 = 5 → 출력 결과: 5 → else 블록 성공 → finally x=2 완료
test(0): x==0 → raise ValueError("zero!") → except ValueError → ValueError: zero! → finally x=0 완료 (else는 실행 안 됨)
test(-2): 10 // -2 = -5 → 결과: -5 → else 블록 성공 → finally x=-2 완료
문제 8. 번호 매기기 파일 출력¶
def print_numbered(filename):
try:
with open(filename, "r", encoding="utf-8") as f:
lines = f.readlines()
for i, line in enumerate(lines):
print(f"{i+1}: {line.strip()}")
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
빈칸 정답
| 빈칸 위치 | 정답 | 이유 |
|---|---|---|
with ______ |
open |
파일 열기 함수 |
f.______() |
readlines |
줄 단위 리스트로 읽기 |
______(lines) |
enumerate |
인덱스 + 값 동시 반환 |
line.______() |
strip |
줄 끝 \n 제거 |
문제 9. 안전한 정수 입력 함수¶
def input_int(prompt):
while True:
try:
value = int(input(prompt))
return value
except ValueError:
print("숫자만 입력하세요.")
빈칸 정답
| 빈칸 위치 | 정답 |
|---|---|
______: (try) |
try |
______ ValueError: |
except |
문제 10. 단어 빈도 파일 분석¶
freq = {}
try:
with open("words.txt", "r", encoding="utf-8") as f:
content = f.read()
words = content.split()
for word in words:
if word in freq:
freq[word] += 1
else:
freq[word] = 1
for word, count in sorted(freq.items(), key=lambda x: x[1], reverse=True):
print(f"{word}: {count}")
except FileNotFoundError:
print("파일 없음")
빈칸 정답
| 빈칸 위치 | 정답 | 이유 |
|---|---|---|
f.______() |
read |
파일 전체를 문자열로 읽기 |
content.______() |
split |
공백 기준으로 단어 분리 |
if word ______ freq |
in |
딕셔너리에 키 존재 여부 확인 |
key=______ |
lambda x: x[1] |
값(빈도)을 기준으로 정렬 |