본문 바로가기
Python/점프 투 파이썬

예외 처리

by k-mozzi 2021. 9. 2.
반응형
Preface

 

오늘은 오류를 발생시키거나 처리·회피하는 방법을 공부했는데, 각 문법의 사용 방법을 익히는 도중 문득 이런 생각이 들었다.

 

'파이썬은 컴파일러가 아닌 인터프리터 언어로, 문장을 한 줄 한 줄 실행시키며 디버깅이 필요한 부분을 즉시 찾아 수정할 수 있는데, 왜 오류를 이렇게 처리할까?'

 

문서에선 오류를 보류시켜야 하는 경우도 존재하며, 오히려 오류를 일부러 발생시켜야 하는 경우도 존재한다고 하는데, 나는 아직 간단한 코드를 작성한 경험밖에 없어 저자가 하고자 하는 말의 본질을 이해하지 못하는 것 같다.

 

다양한 코드를 작성해본 후 어느 정도 경험이 쌓이면 해당 코드의 의미를 이해할 수 있을 것이라 생각한다.


 

1. 오류 처리 방법

 

try:
    4 / 0
except:
    print('오류입니다.')
# 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행


try:
    4 / 0
except ZeroDivisionError:
    print('오류입니다.')
# 오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행


try:
    4 / 0
except ZeroDivisionError as e:
    print(e)
# 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법

 


 

2. finally문

 

f = open('hi.txt', 'w')
try:
    f.write('hi')
finally:
    f.close()
# finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다.
# finally절은 사용한 리소스를 close해야 할 때에 많이 사용한다.

 


 

3. 2개 이상의 오류 처리 방법

 

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


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


try:
    a = [1, 2]
    print(a[3])
    4/0
except (ZeroDivisionError, IndexError) as e:
    print(e)
# 2개 이상의 오류를 동일하게 처리하기 위해서는 괄호를 사용한다.

 


 

4. else절

 

try:
    age = int(input('나이를 입력하세요: '))
except:
    print('숫자를 입력해주세요')
else:
    if age <= 18:
        print('미성년자는 출입금지입니다.')
    else:
        print('환영합니다.')
# try문 수행중 오류가 발생하면 except절이 수행되고 오류가 없으면 else절이 수행된다.

 


 

5. 오류 회피 방법

 

try:
    4 / 0
except ZeroDivisionError:
    pass
# 오류가 발생해도 오류를 회피하는 방법

 


 

6. 오류를 발생시키는 방법

 

class Bird:
    def fly(self):
        raise NotImplementedError
# NotImplementedError는 파이썬 내장 오류로,
# 꼭 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 일으키기 위해 사용한다.

class Eagle(Bird):
    pass
# fly 함수가 부모 클래스에서 정의되지 않았으므로
# 오버라이딩이 필요한 상태

eagle = Eagle()
print(eagle.fly())
# 오류 발생

 


 

6_2. 오버라이딩을 통한 오류 해결

 

class Bird:
    def fly(self):
        raise NotImplementedError


class Eagle(Bird):
    def fly(self):
        print('very fast')

eagle = Eagle()
print(eagle.fly())

 


 

7. 예외 만들기

 

class MyError(Exception):
    def __str__(self):
        return '허용되지 않은 별명입니다.'
# __str__ 메서드는 print(e)처럼 오류 메시지를 print문으로 출력할 경우에 호출되는 메서드이다.
# 오류 클래스에만 적용되는 것인가?

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


print(say_nick('천사'))
print(say_nick('바보'))


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

 

728x90
반응형

'Python > 점프 투 파이썬' 카테고리의 다른 글

라이브러리  (0) 2021.09.05
내장 함수  (0) 2021.09.03
패키지  (0) 2021.09.01
모듈  (0) 2021.09.01
클래스  (0) 2021.08.30

댓글