점프 투 파이썬 - 예외처리
Language/Python

점프 투 파이썬 - 예외처리

뉴비뉴 2019. 7. 15.

오류 예외 처리 기법

try, except문

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

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

except 블록은 수행되지 않는다.

 

1. try, except만 쓰는 방법

try:
    ...
except:
    ...

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

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

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

try:
    ...
except 발생 오류 as 오류 메시지 변수:
    ...
    
이 경우는 두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법이다.
이 방법의 예를 들어보면 다음과 같다

try:
    4 / 0
except ZeroDivisionError as e:
    print(e)
    
위 처럼 4를 0으로 나누려고 하면 ZeroDivisionError가 발생하여 except 블록이 실행되고
변수 e 에 담기는 오류메시지를 다음과 같이 출력한다.

결과값: division by zero

try .. finally

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

보통 finally절은 사용한 리소스를 close해야 할 때에 많이 사용한다.

f = open('foo.txt', 'w')
try:
	# 무언가를 수행한다.
finally:
	f.close() # try문을 수행한 후 예외 발생 여부와 상관없이 finally 절에서 f.close()로 열린 파일을 닫는다.

여러개의 오류 처리하기

try:
    ...
except 발생 오류1:
   ... 
except 발생 오류2:
   ...
   
즉 0으로 나누는 오류와 인덱싱 오류를 다음과 같이 처리할 수 있다.

try:
    a = [1,2]
    print(a[3]) # a는 2개의 요소값을 가지고 있기 때문에 a[3]은 IndexError를 발생시키므로 "인덱싱할 수 없습니다"
    4/0 # 인덱싱 오류가 먼저 발생했으므로 4/0으로 발생되는 ZeroDivisionError 오류는 발생하지 않았다.
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱 할 수 없습니다.")
    
[!]
except ZeroDivisionError as e:
	print(e) # 와 같이 오류 메시지도 가져올 수 있다.
except IndexError as e:
	print(e) # 와 같이 오류 메시지도 가져올 수 있다.
    
[!] ZeroDivisionError와 IndexError 를 함께 처리할 수도 있다.
except (ZeroDivisionError, IndexError) as e:
	print(e)

오류 회피하기

try:
	f = open("나없는파일",'r')
except FileNotFoundError:
	pass # pass를 사용하여 오류를 그냥 회피하도록 작성한 예제

오류 일부러 발생시키기

파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.

예를 들어 Bird 클래스를 상속받는 자식 클래스는 반드시 fly 라는 함수를 구현하도록 만들고 싶은 경우

(강제로 그렇게 하고 싶은 경우) 가 있을 수 있다. 다음 예를 보자

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

class Eagle(Bird): 
    pass 

eagle = Eagle()
eagle.fly()
# Eagle 클래스는 Bird 클래스를 상속받는다. 그런데 Eagle 클래스에서 fly 함수를 구현하지
# 않았기 때문에 Bird 클래스의 fly 함수가 호출된다. 그리고 raise 문에 의해 NotImplemented Error가 발생

※ 상속받는 클래스에서 함수를 재구현하는 것을 메서드 오버라이딩이라고 부른다.

# NotImplementedError가 발생되지 않게 하려면 다음과 같이 Eagle 클래스에 fly 함수를 반드시 구현해야 한다.

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

eagle = Eagle()
eagle.fly()

예외 만들기

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

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

say_nick("천사") # 천사 출력
say_nick("바보") # MyError 발생

 

 

'Language > Python' 카테고리의 다른 글

점프 투 파이썬 - 외장 함수  (0) 2019.07.16
점프 투 파이썬 - 내장 함수  (0) 2019.07.15
점프 투 파이썬 - 패키지  (0) 2019.07.15
점프 투 파이썬 - 모듈  (0) 2019.07.12
점프 투 파이썬 - 클래스  (0) 2019.07.12

댓글

💲 추천 글