[Python] 예외 처리

Jeongyun Heo·2020년 12월 20일
0

Python

목록 보기
13/36

점프 투 파이썬 참고: https://wikidocs.net/30

오류 나면 프로그램이 멈추는데 예외 처리 하면 안 멈추고 밑에 코드도 실행된다.

파이썬은 try, except를 사용해서 예외적으로 오류를 처리할 수 있게 해준다.

try:
  #오류가 발생할 수 있는 구문
except Exception as e:  ⬅️ 오류가 발생했을 때
  #오류 발생
else:  ⬅️ 오류가 발생하지 않았을 때
  #오류 발생하지 않음
finally:
  #무조건 마지막에 실행

✍️  자주 발생하는 오류

🔷  디렉터리 안에 없는 파일을 열려고 시도했을 때

없는 파일을 열려고 시도하면 FileNotFoundError 오류가 발생한다.

🔷  0으로 다른 숫자를 나누는 경우

0으로 나누려고 하면 ZeroDivisionError 오류가 발생한다.

🔷  리스트에 없는 값을 호출했을 때

IndexError 오류가 발생한다.


✍️  오류 예외 처리 기법

try, except문의 기본 구조

try:
  ...
except [발생 오류 [as 오류 메시지 변수]]: 👈 괄호는 생략가능
  ...

try 블록 수행 중 오류가 발생하면 except 블록이 수행된다.
try 블록에서 오류가 발생하지 않는다면 except 블록은 수행되지 않는다.

except 구문의 [ ] 괄호 안의 내용은 생략할 수 있다.

🔷  1. try, except만 쓰는 방법

try:
  ...
except:
  ...

오류 종류에 상관없이 오류가 발생하면 except 블록 수행

🔷  2. 발생 오류만 포함한 except문

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

오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만
except 블록을 수행

🔷  3. 발생 오류와 오류 메시지 변수까지 포함한 except문

try:
  ...
except 발생 오류 as 오류 메시지 변수:
  ...

두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법

try:
    4 / 0   ⬅️ 0으로 나누면 에러 남
except ZeroDivisionError as e:  ⬅️ 에러 내용이 변수e에 담긴다
    print(e)  ⬅️ 에러 내용 출력
    
👉 division by zero
try:
    f = open('none', 'r')
except FileNotFoundError as e:  ⬅️ try문이 오류가 났을 때 실행
    print(str(e))
else:  ⬅️ try문이 오류가 안 나고 성공했을 때 실행
    data = f.read()
    print(data)
    f.close()

✍️  try .. finally

try문에는 finally절을 사용할 수 있다.
finally절은 try문 예외 발생 여부에 상관 없이 항상 수행된다.
사용한 리소스를 close할 때 많이 사용

f = open('foo.txt', 'w')
try:
    # 무언가를 수행한다.
finally:
    f.close()
f = open('foo.txt', 'w')
try:  ⬅️ 오류 날 수 있는 걸 시도하는 거
    # 무언가를 수행한다.
    data = f.read()
    print(data)
except Exception as e:  ⬅️ 오류 났을 때 내용 담는 거
    print(e)
finally:  ⬅️ 오류 여부 상관 없이 무조건 실행하는 거
    f.close()

✍️  여러 개의 오류 처리하기

try문 안에서 여러 개의 오류를 처리하기 위해 다음 구문을 사용

🔹  각 오류마다 다르게 처리하고 싶을 때

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

🔹  오류를 동일하게 처리하고 싶을 때

괄호( )를 사용하여 묶어서 처리

try:
    a = [1,2]
    print(a[3])
    4/0
except (ZeroDivisionError, IndexError) as e: ⬅️ 괄호로 묶는다
    print(e)

✍️  오류 회피하기

오류가 발생해도 그냥 지나가라

프로그래밍을 하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있다.

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

pass를 사용하여 오류를 그냥 회피하도록 작성한다.

try:
    f = open("내가없는파일", 'r')
except FileNotFoundError:  ⬅️ 이 오류가 발생했을 때 그냥 지나가겠다
    pass

✍️  오류 일부러 발생시키기

프로그래밍을 하다 보면 종종 오류를 일부러 발생시켜야 할 경우도 생긴다.
raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.

class Bird:
    def fly(self):
        raise NotImplementedError  ⬅️ 오류 발생하게 해놓음. 오버라이딩 해야 됨

class Eagle(Bird):
    def fly(self):  
        print("very fast")  ⬅️ 오류 없애기 위해 오버라이딩 함

eagle = Eagle()
eagle.fly()

👉 very fast

raise NotImplementedError 때문에 수정 안 하면 그대로 오류가 발생.
오류가 발생하지 않도록 하기 위해서 fly 함수를 수정 해줘야 함.
fly 함수 변형해서 쓰라고 강제하는 것


✍️  예외 만들기

프로그램 수행 도중 특수한 경우에만 예외 처리를 하기 위해서
예외를 만들어서 사용한다.

예외는 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.

📕 Exception 클래스

모든 오류의 최상위 부모
무슨 오류 날 지 모르겠을 때 Exception 쓰면 됨
모든 오류 다 잡아낼 수 있음

__str__ 메서드는 print(e)처럼 오류 메시지를 print문으로 출력

class MyError(Exception):  ⬅️ Exception 클래스 상속
    def __str__(self):  ⬅️ __str__ 메서드 사용
        return "허용되지 않는 별명입니다."


def say_nick(nick):
    if nick == '바보':
        raise MyError()
    print(nick)


try:
    say_nick('천사')
    say_nick('바보')
except MyError as e:
    print(e)
    
👉
천사
허용되지 않는 별명입니다.

0개의 댓글