파이썬 예외처리 try except else finally raise 정리

개발자 강세영·2022년 5월 13일
0

TIL

목록 보기
28/65

예외처리

일반적으로 프로그래밍은 오류를 피하는게 맞지만, 오류를 무시하거나 적절히 처리해줘야 할 때도 있다. 이럴때 예외처리 문법을 활용할 수 있다.

예외처리를 쓰는 이유

  • 예외 처리 없이 반복문이나 조건문을 돌릴때 에러가 나면 바로 멈추게 되지만, 예외 처리를 하면 중간에 에러가 나도 프로그램을 계속 실행시킬 수 있다.
  • 예외 처리는 보다 안정적이고, 오류에 강한 프로그램을 만들 수 있게 끔 도와준다.
  • 여러 가지의 에러 상황을 코드 몇 줄로 대처할 수 있다.

파이썬 에러의 종류

  • 에러들은 대부분 파이썬 Exception 클래스의 파생 클래스이다.
  • Exception 클래스를 상속받아서 나만의 에러를 만들 수도 있다.

파이썬으로 코딩하다보면 흔하게 나오는 것들만 정리해보면 다음과 같다.

  • ImportError: 임포트 하려는 것을 못 찾음
  • ModuleNotFoundError: 모듈을 못 찾음
  • SyntaxError: 대부분의 문법 오류
  • IndentationError: 들여쓰기 오류
  • TypeError: 잘못된 자료형을 사용한 오류
  • ValueError: 자료형은 문제없지만 값이 문제인 경우
  • ZeroDivisionError: 0으로 나누기를 했을 때
  • IndexError: 인덱스가 범위를 벗어난 오류
  • KeyError: 참조하려는 키가 기존 키 집합에 없음
  • StopIteration: 이터레이터에 의해 생성된 항목이 더 없다는 것을 알려주기 위해 나옴

try, except문

기본 문법
try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...

try 블록 수행 중 오류가 발생하면 except 블록이 수행되고, try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다. [발생 오류[as 오류 메시지 변수]] 이 부분은 생략 가능하다. 오류 메시지 변수를 만들어 주면 except 블록에서 프린트 해서 오류의 내용을 알 수 있다.

try:
    ...
except 발생 오류1:
   ... 
except 발생 오류2:
   ...

위와 같이 except를 여러 개 써놓으면 각각의 오류에 대한 예외 처리가 가능하다

try:
    a = [1,2]
    print(a[3])
    4/0
except (ZeroDivisionError, IndexError) as e:
    print(e)

위와 같이 except를 튜플 형태로 써놓으면 한 줄에서 여러 개의 오류를 동일하게 처리하는 것도 가능하다.

except Exception as e:
	print(e)

except Exception을 쓰면 모든 에러에 대해 같은 처리를 할 수 있다.

try ... else ...

try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...
else:  # 오류가 없을 경우에만 수행된다.
    ...

if else 문같이 else도 사용 가능하다.

try .. finally

f = open('foo.txt', 'w')
try:
    ...
finally:
    f.close()

finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다. 위 코드에서 foo.txt를 열었는데, 에러가 나든 안나든 마지막에는 foo.txt 닫게 된다는 뜻이다. 어떤 경우에서든 close를 해야할 때 유용하다.

raise

일부러 에러를 발생시켜야하는 경우가 있는데 이럴 때 raise를 쓸 수 있다. raise는 꼭 try와 같이 쓰이는 건 아니고 원하는 부분에서 자유롭게 쓸 수 있다.

raise ValueError 
print("123")

>Traceback (most recent call last):
  File "c:\Users\Desktop\practice.py", line 1, in <module>
    raise ValueError
ValueError
위 코드를 실행하면 그냥 ValueError가 뜨고 123은 프린트 되지 않는다

raise + 에러 이름을 붙여 쓰거나 에러 이름("메시지")도 활용 할 수 있다.

a = int(input("1~5 까지 숫자 입력 : "))
if a < 1 or a > 5: 
  raise Error("밸류 에러")
print(f"입력한 a : {a} 입니다.")  
6 입력
출력:  raise Error("밸류 에러")

자료 출처
https://wikidocs.net/30
https://justkode.kr/python/try-except
https://blockdmask.tistory.com/538
https://wayhome25.github.io/python/2017/02/26/py-12-exception/

0개의 댓글