AIFFEL - Python(7) Exception Handling

JoBoB·2023년 11월 19일
0

AIFFEL - Python

목록 보기
10/10
post-thumbnail

AIFFEL에서 공부한 exception handling에 대해 정리하자


파이썬에서 오류는 크게 2가지

오류 종류

  • Syntax Error (구문오류) : 파이썬 문법에 맞지 않아 실행도 전에 오류 발생
  • Runtime Error (런타임 오류) : 프로그래밍 실행 중에 발생

Runtime Error를 다른 말로 Exception이라고 함


예외 종류

외울 필요는 없다고 생각하지만, 에러가 발생 시 어떤 에러인지 인지하는 것만으로도 도움이 된다.

  • IndexError : 인덱스 범위 초과 오류
  • NameError : 생성되지 않은 변수, 함수 참조
  • TypeError : 올바른 type끼리 연산하지 않은 경우 출력
  • IndentationError : 들여쓰기 오류
  • ValueError : 부적절한 값을 argument에 받은 경우 출력
  • KeyError : 딕셔너리에서 없는 key를 요청한 경우 출력
  • ZeroDivisionError : 0으로 나눌 경우 출력 출력
  • AttributeError : 잘못된 attribute를 호출한 경우 출력

+) attribute
클래스 내부에 있는 메소드와 변수를 의미
세부적으로 클래스 속성과 인스턴스 속성이 있다.

  • FileNotFoundError : file이 없는 경우 출력

Exception Handling (예외처리)

예외가 발생할 수 있는 상황에서도 일단 프로그램 실행을 계속 유지하도록 하는 조치


1. 조건문 사용

장 : 속도가 빠름
단 : 모든 예외 상황을 예측해서 조건문으로 처리해야함

정수를 입력하지 않아 발생하는 ValueError (예외)를 처리하기 위해 조건문 사용


2. try - except 구문

장 : 모든 예외 상황을 예측할 필요는 없음
단 : 속도가 늦음


2-1 try - except 구문 (기본구조)

try:
	예외가 발생할 수도 있는 코드
    
except [발생오류] [as 오류메세지 변수]:
	예외가 발생할 경우 실행할 코드

정상 작동하는 경우, try문만 실행되고 except문은 실행되지 않는다.

그러나, 방금과 같이 float에 잘못된 값이 들어간 ValueError 발생시, except문 실행


+) except 발생오류 as 메세지 변수

  • 발생오류 : ValueError 등 오류 이름을 적어 오류 이름이 일치할 경우 이 except문 실행
  • 메세지 변수 : 오류 이름 옆에 출력되는 메세지를 변수에 할당

ValueError가 발생한 경우, 설정한 문자열과 변수 e에 할당된 메세지 출력

ZeroDivisionError가 발생한 경우, 설정한 문자열과 변수 e에 할당된 메세지 출력


+) pass 구문

농담이지만, 프로그래밍에서 제일 좋은 코드는 일단 돌아가는 코드이다.
프로그램이 일단 돌아가는지 확인하기 위해 중요하지 않은 예외는 넘어가기 위해 pass 사용

try:
	예외가 발생할 수도 있는 코드
    
except [발생오류] [as 오류메세지 변수]:
	pass

문제없이 코드의 끝부분인 '종료!'가 출력되는 것을 볼 수 있다.


2-2 try - except - else 구문

try:
	예외가 발생할 수도 있는 코드
    
except [발생오류] [as 오류메세지 변수]:
	예외가 발생할 경우 실행할 코드

else:
	예외가 발생하지 않았을 경우, 실행할 코드

else문 사용 유무는 스타일 차이, try문에서 따로 구분하지 않고 실행시켜도 돌아가기 때문이다.

2-3 try - except - else - finally

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 함수

우리가 의도하지 않은 방향으로 가는 것을 방지하기 위해 일부로 오류 발생

raise [오류이름 or Exception ('메시지')]
  • 오류이름 : 명칭을 제대로 쓴다는 조건하에, 어떤 오류문이든 출력해준다.

0으로 나누지도 않았지만, 오류문 명칭을 정확히 썼기 때문에 출력해준다.

반대로, 오류문의 명칭이 틀리는 순간, 얄짤없다.
마음편히, Exception 을 써주는게 좋다.


  • 메세지 : 오류문을 해석해주는 메세지를 출력한다.

raise를 활용하면, 우리가 오류문 명칭만 제대로 쓴다는 조건하에, 원하는 오류문 출력 가능


예외 처리 전략

EAFP : it's Easier to Ask Forgiveness than Permission

용서가 허락보다 쉽다.
먼저 최대한 완벽하게 코딩을 짠 다음, 에러 발생 시, 그때마다 예외처리 실행
try - except 문 자주 사용

LBYL : Look Before You Leap

누울 자리를 보고 다리를 뻗어라.
어떤 에러가 발생할지 미리 생각하고 예외처리를 먼저 진행한 후, 코딩
if문으로 우선 예외처리

profile
딥러닝을 메인으로 나아가고자 하는 뉴비입니다

0개의 댓글