[Do it! 점프 투 파이썬-스터디 노트] 05장 파이썬 날개 달기(05-4 예외 처리)

2021. 4. 18. 11:15PYTHON/Do it! 점프 투 파이썬

 

 

05장 파이썬 날개 달기

 

 

 

05-4 예외 처리

 

오류는 어떨 때 발생하는가?

FileNotFoundError, ZeroDivisionError, IndexError 등

 

 

오류 예외 처리 기법

 

try, except문

try:

    ...

except [발생오류[as 오류 메세지 변수]]:

    ...

 

([]는 괄호 안의 내용을 생략할 수 있다)

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

 

 

1. try, except만 쓰는 방법: 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행한다.

try:

    ...

except:

    ...

 

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

try:

    ...

except 발생 오류:

    ...

 

3. 발생 오류와 오류 메세지 변수까지 포함한 except문: 두 번째 경우에서 오류 메세지의 내용까지 알고 싶을 때 사용한다.

try:

    ...

except 발생 오류 as 오류 메세지 변수:

    ...

 

try:
	4/0
except ZeroDivisionError as e:
	print(e)

division by zero

변수 e에 담기는 오류 메세지: division by zero

 

 

 

 

 

try ... finally

finally 절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다. 보통 finally절은 사용한 리소스를 close해야할 때 많이 사용한다.

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

foo.txt 파일을 쓰기 모드로 연 후에 try문을 수행한 후 예외 발생 여부와 상관없이 finally절에서 f.close()로 열린 파일을 닫을 수 있다.

 

 

 

 

여러 개의 오류 처리하기

try:

    ...

except 발생오류1:

    ...

except 발생오류2:

    ...

 

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

인덱싱 오류가 먼저 발생했으므로 4/0으로 발생되는 ZeroDivisionError 오류는 발생하지 않았다.

 

 

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

list index out of range

 

2개 이상의 오류를 동시에 처리하기 위해서는 괄호를 사용하여 함께 묶어 처리하면 된다.

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

 

 

 

오류 회피하기

try:
	f=open("나없는파일", 'r')
except FileNotFoundError:
	pass

파일이 없더라도 오류를 발생시키지 않고 통과한다.

 

 

 

오류 일부러 발생시키기

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

class Bird:
	def fly(self):
    	raise NotImplementedError

Bird 클래스를 상속받는 자식 클래스는 반드시 fly 함수를 구현해야 한다. 만약 자식 클래스가 fly함수를 구현하지 않은 상태로 fly 함수를 호출하면 Bird 클래스의 fly 함수가 호출되고 raise 문에 의해 NotimplementedError가 발생한다.

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

NotImplementedError가 발생되지 않게 하려면 자식 클래스에서 fly 함수를 반드시 구현해야 한다.

class Eagle(Bird):
	def fly(self):
    	prin("very fast")
        
eagle=Eagle()
eagle.fly()
very fast

 

 

 

예외 만들기

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

class MyError(Exception):
	pass

 

 

def say_nick(nick):
	if nick=='바보':
    	raise MyError
    print(nick)
    
say_nick("천사")
say_nick("바보")
try:
	say_nick("천사")
    say_nick("바보")
except MyError:
	print("허용되지 않는 별명입니다.")

 

 

오류 메세지를 사용하고 싶다면 예외처리를 하면 된다. 오류 메세지를 출력했을 때 오류 메세지가 보이게 하려면 오류 클래스에 __str__ 메서드를 구현해야 한다. __str__메서드는 print(e)처럼 오류 메세지를 print문으로 출력할 경우에 호출되는 메서드이다.

class MyError(Exception):
	def __str__(self)::
    	return "허용되지 않는 별명입니다."