ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 76 - (파이썬) 예외 객체와 예외 구분
    study with Q - 파이썬 2024. 8. 21. 16:49

    # 예외 객체 : 예외와 관련된 정보를 담고 있는 객체

    try:
    except 예외의_종류 as 예외_객체의_변수_이름:
      #NameError as e
      #IndexError as exeption
      #ValueError
      #Exception (aka 모든 예외들의 부모)
      
      #예외_객체의_변수_이름은 exeption이나 e를 사용한다

     

    try:
      변수없다[0]
      #NameError가 발생할 수 있게 존재하지 않는 변수의 0번째 인덱스에 접근
    except Exception as e:
      print(type(e))
      print(e)
    >>>
    <class 'NameError'>
    name '변수없다' is not defined

     

    뭐 사실 e는 객체로 단순한 문자열이 아닌 여러 개의 속성들을 가지고 있는데, print 함수로 출력할 때 자동으로 문자열로 변환해서 출력하기 때문에 name '변수없다' is not defined로 나오게 되는 것.

     

    # 조건문으로 예외 구분하기

    : except에 조건문으로 처리를 해서 어떤 예외인지 구분을 하고 그에 따른 처리를 넣을 수도 있다.

    try:
      [무슨 무슨 프로그램, 사용자에게 입력을 받고 네트워크로 전송하는 뭐 그런거]
      #NameError가 발생할 수 있게 존재하지 않는 변수의 0번째 인덱스에 접근
    except Exception as e:
      if type(e) == ValueError:
        print("정상적인 입력값이 아닙니다.")
      elif type(e) == ConnectionError:
        print("네트워크 연결을 다시 확인 후 시도해주세요.")
      else:
        i = input("오류 내용을 전송하시겠습니까? [Y/N]")
        if i in ["Y", "y"]:
          메일전송(type(e), str(e))

    But...

    들여쓰기가 너무 많아 > 안멋쪄

    > 이러한 문법을 쉽게 작성할 수 있는 코드를 제공해준다.

    try:
      [무슨 무슨 프로그램, 사용자에게 입력을 받고 네트워크로 전송하는 뭐 그런거]
    except ValueError as e:
      print("정상적인 입력값이 아닙니다.")
    except ConnectionError as e:
      print("네트워크 연결을 다시 확인 후 시도해주세요.")
    except Exception as e:
      i = input("오류 내용을 전송하시겠습니까? [Y/N]")
      if i in ["Y", "y"]:
        메일전송(type(e), str(e))

     

    위와 같은데 들여쓰기도 더 적고 코드 이즈 깔끔깔끔

     

    참고로)

    코드는 위에서 부터 읽어드리기 때문에 except Exception as e:가 가장 상단에 있다면 모든 예외가 '오류 내용 전송'처리 되어버린다.

    그렇지만 except Exceptionas e:가 없다면 입력한 특정 에러가 아닐 경우 프로그램이 죽어버리게 된다.

     

    참고로 2)

    프로그램이 무조건 죽지 않는게 마냥 좋은 것은 아닌데, 살아도 사는게 아닐 수 있다. (오히려 더 위험할 수도)


    https://replit.com/@wh3308/yeoeceori3#main.py

Designed by Tistory.