ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python) Python의 예외처리
    Programming/Python 2019. 7. 31. 00:09

    TIL(Today I learned) 을 기록하는 공간입니다.

    잘못된 내용 또는 부족한 내용에 대한 수정 및 지적 환영합니다. 


     

    #Python의 Exception처리

     

    오늘은 python에서 Exception(예외)처리를 하는 방법에 대해서 공부해본다.

    예외처리라고 함은 흔히들, 간단하게 말해서

    정상동작이 아닌 다른 동작에 대한 처리를 말한다.

    height = "170cm"
    
    number = (int)height
    #>> height은 "170cm"로 int형의 데이터가 아니기 때문에 int로 casting(형변환)을 할 경우 에러가 발생한다.
    """
    Traceback (most recent call last):
      File "errTest.py", line 2, in <module>
        number = int(height)
    ValueError: invalid literal for int() with base 10:
    """

     

    이처럼 원래는 number라는 변수에는 숫자가 들어가야한다.

    그래서 height라는 변수가 int형으로 casting (형변환) 되어 저장하는 과정이 필요하고,

    이를 정상동작이라고 할 수 있다.

     

    만약 height 안에 숫자가 아닌 문자형 데이터가 들어갔을 경우, casting을 할 수 없기 때문에,

    예기치 못한 에러, 즉 정상동작이 아닌 경우가 발생하게 된다.

     

    이 경우에는 어떻게 처리하면 좋을 것인가.에 대한 내용을 기술하는 것이 Exception 처리라고 할 수 있다.

     

    height = "170cm"
    try:
    	number = int(height)
    except ValueError:
    	print(height+"은(는)숫자가 아닙니다")
    
    #출력>> 170cm은(는) 숫자가 아닙니다.

     

    앞 문제에 대한 Exception 처리는 이와 같이 할 수 있다.

     

    일단 에러가 발생할 여지가 있는 부분을 try 블럭으로 감싼다.

    그리고 그 아래, except와 함께 발생할  가능성이 있는 에러의 이름을 적고, 

    에러발생시 어떤 처리를 하면 좋을지 기술하면 된다.

     

    이러한 처리를 하게 될 경우, 에러가 발생했을때, except 부분으로 넘어가서

    에러메세지 대신 사용자가 지정한 동작을 할 수 있게 된다. 

     

    만약 어떤 에러가 발생하는지, except 뒤에 작성할 에러의 이름을 알지 못한다면!

    그러한 경우에는 어떻게 하면 좋을까?

     

    try:
        #에러발생
        name = "walnuty"
        age = (int)name
        
        #에러발생
        list = [1,2,3]
        print(list[3])
    except:
    	print("에러가 발생했습니다")

    사실 try except 문을 쓸 때, 위 예제처럼 except 뒤에 이름을 쓰지 않고

    바로 : 으로 마무리해도 예외처리가 되기는 한다.

     

    그러나 위 코드에서는 두 개의 에러가 발생한다. 

    먼저 문자형을 숫자형으로 casting할 때 발생하는 ValueError

    >>ValueError: invalid literal for int() with base 10: 'walnuty'

     

    그리고 범위 내에 존재하지 않는 list값을 호출했을때 발생하는 IndexError

    >>IndexError: list index out of range

     

    위 방식으로 except: 만을 이용하여 예외 처리를 할 경우

    (에러발생의 가능성을 인지하지 못한 상태라고 가정하자.)

    어떠한 에러든 간에, "에러가 발생했습니다"라는 메세지를 출력하기 때문에

     

    castring할때 ValueError가 발생하는지, list에서 값을 꺼낼때 ValueError가 발생하는지

    명확하게 알 수 없다.

     

    그래서 발생할 수 있는 에러의 이름을 정확하게 알지 못하는 경우

    다음과 같은 방법을 이용할 수 있다.

     

    try:
        #에러발생
        name = "walnuty"
        age = int(name)
    
        #에러발생
        list = [1,2,3]
        print(list[3])
    except Exception as ex:
    	print("에러가 발생했습니다",ex)

    위와 같은 방법을 사용하여 예외처리를 수행할 경우, except부분으로 넘어갔을때,

    ex에 발생한 에러의 정보를 담고, 이것을 출력문과 함께 뿌려준다.

     

    결과는 어떻게 될까?

     

    >>출력 : 에러가 발생했습니다 invalid literal for int() with base 10: 'walnuty'

     

    이렇게 에러메세지를 함께 출력함으로써 에러발생 부분을 확인할 수 있게 된다.

     

    'Programming > Python' 카테고리의 다른 글

    Python) Package와 Module  (0) 2019.07.28
Designed by Tistory.