TIL[54]. Python_Exceptions

jake.log·2020년 8월 24일
0

35. Exceptions

short_list = [1, 2, 3]

총 요소의 수가 3개인 list 이다.
하지만 만일 실수로 4번째 요소를 indexing 하게 되면 IndexError 가 난다.

fourth_element = short_list[3]

IndexError                                Traceback (most recent call last)
<ipython-input-2-54d383a36828> in <module>()

이렇게 Exception이 발생하면, 발생한 코드 위치에서 다음 코드들이 실행되지 않고 곧바로 프로그램이 종료를 한다.

하지만 Exception이 발생해도 해당 프로세스가 종료하지 않고 대신에 다른 로직을 실행하게 한 후 프로그램을 계속 실행하게 할 수 있다.

이러한 것을 exception handling이라고 한다.

예를 들어, user가 잘못된 값을 input으로 입력해서 exception이 일어날 때
종료하지 말고 유저에게 메세지를 리턴하도록 한다.

Exception handling은 try except 구문을 사용해서 실행한다.

try:
     문장1
     문장2
     ...
     문장N    
except Exception:
     exception이 났을 경우 실행할 예외 처리코드
finally:
     Exception 여부와 상관없이 항상 마지막에 실행되는 코드

예시 )
앞서 보았던 코드 예제의 경우 만일 IndexError가 났을 경우 프로그램을 종료하는 대신 에러 메세지를 출력하고 -1을 리턴하기 위해서는 다음 처럼할 수 있다.

def return_elem_or_minus_one(index):
    short_list = [1, 2, 3]
    elem = 0

    try:
        elem = short_list[index]
        print("이 문장은 exception이 발생되면 실행되지 않습니다!")
    except IndexError:
        print(f"이 문장은 Exception이 발생하면 실행 됩니다")
        elem = -1
    finally:
        print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")

    return elem
 
return_elem_or_minus_one(1)
이 문장은 exception이 발생되면 실행되지 않습니다!
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
2
return_elem_or_minus_one(4)
이 문장은 Exception이 발생하면 실행 됩니다
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!
-1

Exception은 이와 같이 index error와 모든 exception을 찾을 수 있다.

def return_elem_or_minus_one(index):
    short_list = [1, 2, 3]
    elem = 0

    try:
        elem = short_list[index]
        print("이 문장은 exception이 발생되면 실행되지 않습니다!")
    except IndexError:
        print(f"이 문장은 Exception이 발생하면 실행 됩니다")
        elem = -1
    except Exception:
        print(f"IndexError가 아닌 다른 종류의 Exception이 발생했습니다")
        elem = -1
    finally:
        print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")

    return elem

또한 Exception을 확인할때 "as" 문을 써서 해당 exception의 객체를 받아 정보를 더 얻을 수 있다.

def return_elem_or_minus_one(index):
    short_list = [1, 2, 3]
    elem = 0

    try:
        elem = short_list[index]
        print("이 문장은 exception이 발생하지 않으면 실행됩니다")
    except IndexError:
        print(f"이 문장은 Exception이 발생하면 실행 됩니다")
        elem = -1
    except Exception as e:
        print(f"IndexError가 아닌 다른 종류의 Exception이 발생했습니다 ==> {e}")
        elem = -1
    finally:
        print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")

    return elem

마지막으로 try 문에서도 else를 사용할 수 있습니다.
Else 문은 exception이 발생하지 않았을때 실행됩니다.

def return_elem_or_minus_one(index):
    short_list = [1, 2, 3]
    elem = 0

    try:
        elem = short_list[index]
        print("이 문장은 exception이 발생하지 않으면 실행됩니다")
    except IndexError:
        print(f"이 문장은 Exception이 발생하면 실행 됩니다")
        elem = -1
    except Exception as e:
        print(f"IndexError가 아닌 다른 종류의 Exception이 발생했습니다 ==> {e}")
        elem = -1
    else:
        print(f"Exception이 발생하지 않았습니다!") 
    finally:
        print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")

    return elem

[Assignment]

왼쪽 상단의 divison 함수를 수정하여서 exception이 발생하는 경우 -1을 리턴하도록 해주세요.

def division(num1, num2):
 result = 0 

 try: 
    result = num1/num2
    print("예외가 없을 때 실행됩니다") 
 except IndexError: 
    print(f"IndexError입니다")
    result = -1 
 except Exception: 
    print(f"예외가 발생했습니다")
    result = -1
 finally:
    print("이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!")  

 return result
profile
꾸준히!

0개의 댓글