TIL24 | Python_Exceptions

이정아·2021년 9월 22일
0

Python

목록 보기
15/20
post-thumbnail

Exceptions은 예외라는 뜻이며,
파이썬에서 예외는 의도하지 않은 에러가 일어나는 경우이다.

List를 예로 들자면

short_list = [1, 2, 3]

print(short_list[3])
>>>IndexError: list index out of range

만일 파이썬에서 index가 0부터 시작한다는 것이 익숙지 않으면 충분히 생길 수 있는 exception이다.

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

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


예를 들어, 잘못된 값을 input으로 입력해서 exception이 일어났다고 해도, 종료하지 않고 유저에게 메세지를 리턴하도록 할 수 있도록 Exception handlingtry ... 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


try에서는 여러 exceptioncatch 할 수 있습니다.

앞서 본 코드에서 IndexError처럼 특정한 exceptioncatch 할 수도 있고 다른 모든 exception들도 catch 할 수 있습니다.

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
    

return_elem_or_minus_one("a")
>>>
IndexError가 아닌 다른 종류의 Exception이 발생했습니다
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!

또한 Exceptioncatch할 때 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
  
  
return_elem_or_minus_one("a")
>>>
IndexError가 아닌 다른 종류의 Exception이 발생했습니다 ==> list indices must be integers or slices, not str
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!

마지막으로 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
    
    
return_elem_or_minus_one(2)
>>>
이 문장은 exception이 발생하지 않으면 실행됩니다
Exception이 발생하지 않았습니다!
이 문장은 exception 발생 여부와 상관없이 무조건 실행됩니다!

문제)
divison 함수를 수정하여서 exception이 발생하는 경우 -1을 return 하도록 해주세요.

def division(num1, num2): 
  return num1 / num2

수정한 코드)

def division(num1, num2): 
  try:
    return num1 / num2
  except Exception:
    return -1

finally만 쓰면❓

def division(num1, num2): 
  try:
    return num1 / num2
  finally:
    return -1
    
print(division(8,4))
>>> -1
#exception 발생 여부와 상관없이 무조건 실행되기에 -1이 리턴 된다.

0개의 댓글