예외처리

매일 공부(ML)·2021년 11월 11일
0

Python

목록 보기
7/38

나타나는 오류

i) 디렉터리 안에 파일을 열려고 시도할 때 발생하는 오류(FileNotFoundError)

>>> f = open("나없는파일", 'r')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '나없는파일'

ii) 0으로 다른 숫자를 나누는 경우 생각(ZeroDivisionError)

>>> 4 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

iii) 얻을 수 없는 값 제시(IndexError)

>>> a = [1,2,3]
>>> a[4]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

오류 예외 처리 기법

  1. try, except문
  • try 블록 수행 중 오류가 발생하면 except블록 수행.

  • try 블록 수행 중 오류 발생 안하면 except 블록 수행 안함1

# 구조
try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...
  1. 다양한 try, except문 사용

i) try, except만 쓰기

  • 오류 종류 상관없이 오류 발생 시 except블록 수행
try:
    ...
except:

ii) 발생 오류만 포함한 except문

  • 오류가 발생할 때, except문에 미리 정해 놓은 오류 이름과 일치 할 때만 except수행
try:
    ...
except 발생 오류:
    ...

iii) 발생 오류와 오류 메시지 변수까지 포함한 except문

  • 오류 메시지의 내용까지 알고 싶을 때 사용
try:
    ...
except 발생 오류 as 오류 메시지 변수:
    ...
  1. try..finally
  • try문 finally절 사용.

  • finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행

  • finally절은 사용한 리소스 close해야 많이 사용

  • 예시

f = open('foo.txt', 'w')
try:
    # 무언가를 수행한다.
finally:
    f.close()

여러개의 오류처리하기

  • 예시
try:
    ...
except 발생 오류1:
   ... 
except 발생 오류2:
   ...
  • 0으로 나누는 오류와 인덱싱 오류 처리

  • 2개 이상의 오류를 동일하게 처리(괄호 사용하여 묶어 처리)

try:
    a = [1,2]
    print(a[3])
    4/0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱 할 수 없습니다.")

try문에 else절 사용하기

  • try문 수행중 오류가 발생 시, except절이 수행되고 오류 없으면 else절 수행
try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...
else:  # 오류가 없을 경우에만 수행된다.
    ...

*예시

try:
    age=int(input('나이를 입력하세요: '))
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')

오류 회피하기

try:
    f = open("나없는파일", 'r')
except FileNotFoundError:
    pass # 오류 회피

오류 일부러 발생시키기

  • raise 명령어를 사용하여 오류 강제 발생

  • 자식 클래스가 함수 강제 구현

class Bird:
    def fly(self):
        raise NotImplementedError
  • fly함수 구현 안함

  • NotImplemented Error 발생

class Eagle(Bird):
    pass

eagle = Eagle()
eagle.fly()

*메서드 오버라이딩 : 상속받는 클래스에서 함수를 재구현하는 것
Traceback (most recent call last):
  File "...", line 33, in <module>
    eagle.fly()
  File "...", line 26, in fly
    raise NotImplementedError
NotImplementedError

*에러 안 뜬다
class Eagle(Bird):
    def fly(self):
        print("very fast")

eagle = Eagle()
eagle.fly() # very fast

예외 만들기

  • 예외처리하기 위해서 일부러 예외를 만들어 사용 (특수한 경우에 사용)
class MyError(Exception):
    pass
*별명 출력 함수

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

천사
Traceback (most recent call last):
  File "...", line 11, in <module>
    say_nick("바보")
  File "...", line 7, in say_nick
    raise MyError()
__main__.MyError # 천사 출력 후 MyError 발생한다.

*예외처리 기법 사용하여 MyError 발생

try:
    say_nick("천사")
    say_nick("바보")
except MyError:
    print("허용되지 않는 별명입니다.")
    
# 결과
천사
허용되지 않는 별명입니다.

*오류 메시지 사용

try:
    say_nick("천사")
    say_nick("바보")
except MyError as e:
    print(e) # 오류 메시지 출력 되지 않는다
    
#__str__메서드 이용해야 오류 메시지 출력

class MyError(Exception):
    def __str__(self):
        return "허용되지 않는 별명입니다."
profile
성장을 도울 아카이빙 블로그

0개의 댓글