05-3 try~except문

윤혜민·박현규 · 25 / 30

이번에는 ifelse문과 비슷하게 동작하지만 상황에 맞게 쓰면 좋은 tryexcept문을 공부해보겠습니다. try~except문은 영어 표현을 그대로 해석하면 어떤 문법인지 대략 느낌이 옵니다. '일단 해(try)보고 뭔가 문제가 생겨서 예외(except)를 처리해야 하면'이라는 의미를 가지고 있습니다.

try~except문 기초 연습하기

그러면 try~except문의 기본 형태를 살펴볼 겸 간단한 코드를 입력해서 실행해보겠습니다. user_input 변수에 "abc"라는 문자열을 저장한 다음 이 값을 int( ) 함수에 전달하여 숫자형으로 변경하려는 코드입니다.

user_input = "abc"
try:
number = <span class="mark">int(user_input)</span>
print(f"변환 성공: {number}")
except:
print("숫자로 변환할 수 없습니다.")

[실행 결과]

숫자로 변환할 수 없습니다.

실행 결과를 보면 알겠지만 "abc"라는 문자열은 숫자로 변환할 수 없습니다. 하이라이트한 코드에서 오류가 발생할 겁니다. 그러면 이 코드는 오류가 발생했으니 중단되거나 오류 메시지를 출력할까요? 실행 결과를 보면 그렇지는 않네요. 왜냐하면 try~except문은 try문의 코드 블록에서 오류가 생기면 except문의 코드 블록이 실행되기 때문입니다. 프로그램이 오류 메시지를 출력하면서 멈추거나 하지 않습니다. 전체 코드를 잘 실행합니다.

왜 if~else문으로 해결할 수 없을까?

ifelse문으로 이 코드를 해결하려고 하면 사실 좀 어렵습니다. 왜냐하면 ifelse문은 조건식이 True 또는 False로 치환되어야 하기 때문입니다. 앞에서 작성한 코드를 if~else문으로 억지로 해결한다면 이렇게 해볼 수는 있습니다.

user_input = "abc"
# if~else로 억지로 처리하기
if user_input.isdigit():
number = int(user_input)
print(f"변환 성공: {number}")
else:
print("숫자로 변환할 수 없습니다.")

[실행 결과]

숫자로 변환할 수 없습니다.

실행 결과를 보면 잘 된 것 같습니다. isdigit( ) 함수는 문자열이 모두 숫자인지 아닌지를 검사해주기 때문에 user_input.isdigit( )은 False로 평가됩니다. 그래서 else문의 코드 블록을 실행합니다. 그러면 잘 된 걸까요? 그렇지 않습니다. 만약 이렇게 코드를 작성하면 어떻게 될까요?

user_input = "-123"
if user_input.isdigit():
number = int(user_input)
print(f"변환 성공: {number}")
else:
print("숫자로 변환할 수 없습니다.")

[실행 결과]

숫자로 변환할 수 없습니다.

실행 결과가 이상합니다. isdigit( ) 함수는 말 그대로 문자열에 있는 각 문자가 숫자인지 아닌지만 검사하지 -가 음수 표시인지 아닌지는 검사할 수 없습니다. -는 말 그대로 문자 -이므로 이 역시도 else문의 코드 블록을 실행합니다. 사람의 관점에서는 if문의 코드 블록을 실행해야 하는데 말이죠. 점점 상황이 복잡해집니다. 하지만 try~except문이면 이 문제를 깔끔하게 해결할 수 있습니다.

user_input = "-123"
try:
number = int(user_input)
print(f"변환 성공: {number}")
except:
print("숫자로 변환할 수 없습니다.")

[실행 결과]

변환 성공: -123

tryexcept문은 일단 try문의 코드 블록을 실행하고 문제가 생길 때만 except문을 처리하므로 조건식에서 처리해야 할 것들을 고려할 필요가 없습니다. "-123"은 int( ) 함수를 통해 음수로 잘 변환되므로 문제 없이 try문의 코드 블록만 실행되었습니다. 언뜻 보면 ifelse문과 tryexcept문은 비슷하게 동작하는 것처럼 보이지만 오류가 예상이 되는 상황에서는 아주 극적인 차이가 날 수 있습니다. 선택은 여러분의 몫입니다. 적절한 문법을 잘 선택하여 사용하기 바랍니다. tryexcept문은 이정도만 연습하면 충분합니다.