ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3월 23일 TIL -try, except문
    TIL(Today I Learned) 2023. 3. 23. 19:16

    Q : 사용자로부터 숫자를 입력받아 100을 입력받은 숫자로 나누는 프로그램을 작성하려고 합니다. 하지만 사용자가 0을 입력하거나, 숫자가 아닌 값을 입력하면 예외가 발생합니다. 이 예외를 처리하고, 그 외의 경우에는 나눗셈 결과를 출력하는 코드를 작성하세요.

    try:
        x = int(input("나눌 수를 입력하세요: "))
        y = 100 / x
    except 영은안됨:
        # 0으로 나누려고 할 때 예외 처리
    except 숫자가아님:
        # 숫자가 아닌 값을 입력했을 때 예외 처리
    else:
        # 나눗셈 결과 출력

     

    첫번째 시도,

    try:
        x = int(input("0"))
        y = 100 / x
    except x == 0:
        print('0은 입력할 수 없습니다.')
    except type(x) != "<class 'int'":
        print('숫자를 입력하세요')
    else:
        print(y)

     

    SyntaxError: invalid syntax 에러가 떴다. 이 에러는  '파이썬(Python)에서는 쓰지 않는 문법'이라는 의미이다. 그래서 다시한번 기본 문법을 살펴보았다.

     

    try, except문의 기본 구조는 이런식으로 짜여져 있다.

    try:
        ...
    except [발생오류 [as 오류변수]]:
        ...

    발생오류를 입력해야하는 칸에는 오류명이 들어가야한다! 오늘도 엉망진창 돌아가는 나의 코드다. 그래서 이렇게 바꿔주었다.

    try:
        x = int(input("나눌 수를 입력하세요: "))
        y = 100 / x
    except ZeroDivisionError:
        print('0은 입력할 수 없습니다.')
    except ValueError:
        print('숫자를 입력하세요')
    else:
        print(y)

    이렇게 하니 잘 굴러갔다. 그러고 보니 except 문 외에도 input()을 제대로 사용할 줄 몰라 어벙벙 시간을 날렸다. 위에 첫번째 시도를 보면 input()자리에 숫자를 냉큼 넣었다. 넣고 돌리니 얘가 계산은 안하고 넣은 숫자만 주구장창 뱉어냈다. 나는 바보같이 코드가 잘못된줄 알고 똑같은 코드를 붙였다 떼어놨다, 수정했다 하고 있었다. 코드를 실행시키고 직접 값을 입력해 줘야 계산이 되는데 말이다. 오늘도 얼렁뚱땅 코딩 공부를 한다. 그래도 이제 다음과 같은 실수는 안할 것이다. 틀린 것이 더 기억에 남으니,,, 

     

    값을 넣고 있는 중... input()괄호 안에 있는 문장은 입력값에 대한 설명으로 채워진다.
    8을 넣었을 때 정상적으로 코드가 실행된다.
    숫자가 아닌 값을 입력했을 때 예외처리
    0을 입력했을 때 예외처리

    오늘 try문에는 else절이 같이 사용되었다. try문 수행중 오류가 발생하면 except절이 수행되고 오류가 없으면 else절이 수행된다. 암묵적으로 try문에 있는 코드는 “에러가 발생할 가능성이 있으므로, 예의주시해야 하는 코드”, except문에 있는 코드는 “try 문에서 기술한 코드에서 발생할 수 있는 에러를 처리하는 부분” 이라는 암묵적 약속이 있다고 한다. 위 코드를 살펴보면 else절에 있는 코드를 try문에 넣어도 큰 문제 없이 작동될것이다. 그런데 왜 else절로 코드를 구분해 놓는 것일까?

    try문에 있는 코드가 에러 발생 가능성이 높은 코드라면 else절에 있는 코드는 비교적 에러 발생 가능성이 매우 낮은 코드로 구성될 것이다. 오류 가능성이 낮다면 굳이 살펴 볼 필요가 없기 때문에 try문에 넣지 않고 따로 구분짓는 것은 아닐까. 좀 더 효율적으로, 좀 더 명확하게 코드를 짜고 전달하기 위해 else 절로 구분 짓는 것이라 생각된다.

    댓글

Designed by Tistory.