AIFFEL에서 공부한 exception handling에 대해 정리하자
파이썬에서 오류는 크게 2가지
오류 종류
- Syntax Error (구문오류) : 파이썬 문법에 맞지 않아 실행도 전에 오류 발생
- Runtime Error (런타임 오류) : 프로그래밍 실행 중에 발생
Runtime Error를 다른 말로 Exception이라고 함
외울 필요는 없다고 생각하지만, 에러가 발생 시 어떤 에러인지 인지하는 것만으로도 도움이 된다.
+) attribute
클래스 내부에 있는 메소드와 변수를 의미
세부적으로 클래스 속성과 인스턴스 속성이 있다.
예외가 발생할 수 있는 상황에서도 일단 프로그램 실행을 계속 유지하도록 하는 조치
장 : 속도가 빠름
단 : 모든 예외 상황을 예측해서 조건문으로 처리해야함
정수를 입력하지 않아 발생하는 ValueError (예외)를 처리하기 위해 조건문 사용
장 : 모든 예외 상황을 예측할 필요는 없음
단 : 속도가 늦음
try:
예외가 발생할 수도 있는 코드
except [발생오류] [as 오류메세지 변수]:
예외가 발생할 경우 실행할 코드
정상 작동하는 경우, try문만 실행되고 except문은 실행되지 않는다.
그러나, 방금과 같이 float에 잘못된 값이 들어간 ValueError 발생시, except문 실행
+) except 발생오류 as 메세지 변수
ValueError가 발생한 경우, 설정한 문자열과 변수 e에 할당된 메세지 출력
ZeroDivisionError가 발생한 경우, 설정한 문자열과 변수 e에 할당된 메세지 출력
+) pass 구문
농담이지만, 프로그래밍에서 제일 좋은 코드는 일단 돌아가는 코드이다.
프로그램이 일단 돌아가는지 확인하기 위해 중요하지 않은 예외는 넘어가기 위해 pass 사용
try:
예외가 발생할 수도 있는 코드
except [발생오류] [as 오류메세지 변수]:
pass
문제없이 코드의 끝부분인 '종료!'가 출력되는 것을 볼 수 있다.
try:
예외가 발생할 수도 있는 코드
except [발생오류] [as 오류메세지 변수]:
예외가 발생할 경우 실행할 코드
else:
예외가 발생하지 않았을 경우, 실행할 코드
else문 사용 유무는 스타일 차이, try문에서 따로 구분하지 않고 실행시켜도 돌아가기 때문이다.
try:
예외가 발생할 수도 있는 코드
except [발생오류] [as 오류메세지 변수]:
예외가 발생할 경우 실행할 코드
else:
예외가 발생하지 않았을 경우, 실행할 코드
finally:
예외가 발생하든 말든 상관없이 실행되는 코드
finally는 무조건 실행되기 때문에 try문의 종료를 알려주는 코드를 주로 사용한다.
심지어, try 구문내에 return이 있어 중간에 try문이 종료되어도 finally는 실행
중간에 return이 발생하여 else의 print문도 출력되지 않았지만, finally는 실행되는 것이 확인
try, except, else, finally는 조건만 맞춘다면, 어떤 조합이든 실행된다
try 조건
- try문은 단독 실행이 불가하고, 무조건 except와 finally 둘 중 하나는 존재
- else는 except와 같이 사용되고, 무조건 except 뒤에 있어야 한다.
모든 조합
1. try - except
2. try - except - else
3. try - except - finally
4. try - except - else - finally
5. try - finally
우리가 의도하지 않은 방향으로 가는 것을 방지하기 위해 일부로 오류 발생
raise [오류이름 or Exception ('메시지')]
0으로 나누지도 않았지만, 오류문 명칭을 정확히 썼기 때문에 출력해준다.
반대로, 오류문의 명칭이 틀리는 순간, 얄짤없다.
마음편히, Exception 을 써주는게 좋다.
raise를 활용하면, 우리가 오류문 명칭만 제대로 쓴다는 조건하에, 원하는 오류문 출력 가능
용서가 허락보다 쉽다.
먼저 최대한 완벽하게 코딩을 짠 다음, 에러 발생 시, 그때마다 예외처리 실행
try - except 문 자주 사용
누울 자리를 보고 다리를 뻗어라.
어떤 에러가 발생할지 미리 생각하고 예외처리를 먼저 진행한 후, 코딩
if문으로 우선 예외처리