Python/Study

python 기초 - 예외 처리 (try, except, finally, Error처리)

pybi 2023. 1. 15. 15:14

이번에는 예외 처리 (try, except, finally, Error처리)에 대해 다루어보고자 한다.

에러 한번 났다고 파이썬 프로그램이 종료될 수 없으니 예외 처리를 해서 다양한 사태에 대비를 하고 에러 로그를 분석해서 코딩을 더욱 정교하게 수정할 수도 있다.

 

우선 에러처리기 때문에 에러를 만들어보면서 확인해보자. 

int("string")

 

 

당연히 에러가 난다. 

PS C:\pymin2> & C:/Users/min/AppData/Local/Programs/Python/Python38/python.exe c:/pymin2/py_study/try,except_test.py
Traceback (most recent call last):
  File "c:/pymin2/py_study/try,except_test.py", line 3, in <module>
    int("string")
ValueError: invalid literal for int() with base 10: 'string'       
PS C:\pymin2>

 

 

이제 try, except 구문으로 변경해서 에러갈 날때 예외처리 동작을 확인해보자.

 

1. Try, Except

try구문을 실행하다가 int("string")에서 에러가 나자 print("try")를 실행하지 않고 바로 except 구문으로 가서 print("except")을 실행한다.

try :
    int("string")
    print("try")
except:
    print("except")

 

 

2. Try, except, finally

finally는 try에서 에러가 나던 안나던 무조건 실행한다. 

아래를 보면 try구문에서 에러가 발생해서 except을 수행시키고 다시 finally를 실행한다.

try :
    int("string")
    print("try")
except:
    print("except")
finally:
    print("finally")
except 
finally

 

 

3. try, except, else, finally

else는 try구문에서 에러가 없는 경우에만 실행된다. 무슨 말이냐면 아래의 경우 try 구문에서 에러가 발생해서 else구문이 실행되지 않았다.

try :
    int("string")
    print("try")
except:
    print("except")
else:
    print("else")
finally:
    print("finally")
except
finally

 

하지만, 아래처럼 try 구문이 정상적으로 실행된다면 except 대신 else구문이 실행된다. (알아두면 좋다)

try :
    print("try")
except:
    print("except")
else:
    print("else")
finally:
    print("finally")
try
else
finally

 

 

4. Error를 로그에 담기 (Exception)

Error는 예상치 못한 에러도 있지만 예상 가능한 Error도 있으며 발생되는 Error에 따른 처리 동작을 정의할 수도 있고, 발생되는 Error를 로그에 담에 디버깅할수도 있다.

try :
    int("string")
    print("try")
except ValueError as e:
    print("except")
    print(e)

 

아까 발생했던 ValueError를 e에 담고 출력하면 아래처럼 파이썬이 종료되지 않은채로 Error의 원인을 로그에 담을 수 있다.

except
invalid literal for int() with base 10: 'string'

 

그런데 만약 어떤 Error 종류가 발생하는지 모른다면? 아래처럼 Exception을 쓰면 된다. (중요!!!!)

try :
    int("string")
    print("try")
except Exception as e:
    print("except")
    print(e)
except
invalid literal for int() with base 10: 'string'

 

다른 Error를 발생시켜보자. 이번에는 'division by zero' 라는 Error가 출력된다. 

try :
    9/0
    print("try")
except Exception as e:
    print("except")
    print(e)
except
division by zero

 

 

5. Error종류에 따른 처리방식 지정

try 구문을 실행했을 때 예측가능한 Error에 대해 처리 방식을 지정할 수 있다. 아래 결과에서 볼 수 있드시 ZeroDivisionError가 발생할때 "except ZeroDivisionError as e:"가 실행되는 것을 알 수 있다.

try:
    9/0
except ValueError as e:
    print("ValueError")
    print(e)
except ZeroDivisionError as e:
    print("ZeroDivisionError")
    print(e)
except Exception as e:
    print("Exception")
    print(e)
ZeroDivisionError
division by zero

 

 

에러 처리에 대한 것은 이정도면 충분하다. 혹시 추가할 내용이 있다면 추후에 추가하도록 하겠다.