예외 처리는 프로그램 실행에서 매우 중요하다.
TV 리모컨을 조금만 잘못 눌러도 TV가 꺼져버린다면(실행이 중단되고 에러가 난다면) 좋은 TV라고 할 수 없을 것이다.
파이썬에서 대부분의 에러는 에러메시지와 함께 어디서 어떤 에러가 발생했는지 알려준다.
다음 코드의 "ZeroDivisionError", "NameError", "TypeError" 같이 built-in exception의 이름이 에러메시지에 출력된다.
이를 이용해서 우리는 예외 처리를 할 수 있다.
>>> 10 * (1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
❗❓ try-except
기본적으로try-except
구문은 다음과 같이 작동한다.
- try구문(try 키워드와 except 키워드 사이에 있는 statements)이 실행된다.
- 만약 예외가 발생하지 않는다면 except 구문은 생략되고 try 구문이 끝까지 실행된 후 종료된다.
- 만약 try 구문 실행 중 except 키워드 뒤에 있는 예외 이름과 일치하는 예외가 발생한다면, try 구문의 나머지 실행문들은 생략되고 해당하는 except 구문에 있는 실행문들이 실행된 후, 예외 발생한 실행문 이후의 try 구문이 실행된다.
- 만약 try 구문 실행 중 예외가 발생했지만, 발생한 예외가 except 구문 안에서 일치하는 예외가 아니라면, 이것은 unhandled exception이므로 전체 실행이 에러 메시지가 출력되며 중단된다.
서로 다른 예외들을 각각 처리하기 위해 하나의 try 구문은 한 개 이상의 except절을 가질 수 있고, " as " 뒤에 alias를 지정할 수도 있다.
try:
[STATEMENT]
except ZeroDivisionError as zero_div_err:
print(zero_div_err)
except NameError as name_err:
print(name_err)
except (RuntimeError, TypeError):
[STATEMENT]
❗❓ else
try-except 구문에 추가적으로 else 구문을 넣을 수 있다.
else 구문은 코드가 exception없이 정상적으로 처리되었을 때에만 실행된다.
(try-except 뒤에 위치한다.)
try:
[STATEMENT]
except:
[STATEMENT]
else:
[STATMENTT]
✔️example
for arg in sys.argv[1: ]:
try:
f = open(arg, 'r')
except OSError:
print('cannot open', arg)
else:
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
정상적으로 실행되었을 때에만 else 구문이 실행되므로, OSError가 났을 때에는 파일이 몇줄인지 출력하는 구문은 실행되지 않는다!
+) 궁금
for arg in sys.argv[1: ]:
try:
f = open(arg, 'r')
print(arg, 'has', len(f.readlines()), 'lines')
f.close()
except OSError:
print('cannot open', arg)
pass
위에 코드랑 뭐가 많이 다를까,,..?
❗❓ finally
finally구문은 try 구문에서 예외가 발생하던, 발생하지 않던 try 구문 실행 이후 무조건 실행되는 구문이다.
finally를 사용하는 이유는??
unhandled exception(except 구문에서 처리하지 않은 예외)이 발생해도 finally 구문은 실행된 후, 에러 메시지가 뜬다.
✔️example
finally절은 모든 event에서 실행됨을 볼 수 있다.
❗❓ raise
raise
는 직접 강제로 오류를 발생시키는 구문이다.
+) 참고 자료
8. Errors and Exceptions — Python 3.9.7 documentation
8. Errors and Exceptions Until now error messages haven’t been more than mentioned, but if you have tried out the examples you have probably seen some. There are (at least) two distinguishable kinds of errors: syntax errors and exceptions. 8.1. Syntax Er
docs.python.org
IT CookBook, 데이터 과학을 위한 파이썬 프로그래밍
한동대학교 경영학•전산학 학사, 포항공과대학교 산업경영공학과 Technology Intelligence 박사 학위를 받았다. 삼성전자 종합기술원의 CTO 전략팀에서 기술 전략과 R&D 정보시스템 개선 업무를 맡았
books.google.co.jp
'Python' 카테고리의 다른 글
[Python Error Handling] ModuleNotFoundError even though Reauirements Satisfied | 패키지 설치하고도 에러가 난다면 🤬 (1) | 2021.10.30 |
---|---|
[python] 람다 함수 lambda function (0) | 2021.10.11 |
[pythonic code] 리스트값을 출력하는 다양한 방법 enumerate() zip() (0) | 2021.10.11 |
[pythonic code] 리스트 컴프리헨션 list comprehention (0) | 2021.10.11 |
[python] 📁파일 다루기 File Handling (0) | 2021.09.20 |
댓글