본문 바로가기
DEV/파이썬 이론

파이썬 코딩 :: 파이썬 try, except, finally, raise_예외처리

by 올커 2022. 9. 1.

파이썬 try, except, finally raise, 예외처리


1. 예외 처리

 ※ 자주 발생하는 오류

   - 없는 파일을 열려고 시도할 경우 : FileNotFoundError

   - 0으로 다른 숫자를 나누는 경우 : ZeroDivisionError

   - 리스트에서 얻을 수 없는 값을 호출할 경우 : IndexError

   - 꼭 작성해야 하는 부분이 구현되지 않았을 경우 : NotImplementError

 

 ※ 구문별 비교

 - try : 오류가 발생할 수 있는 구문

 - except Exception as e : 오류 발생

 - else : 오류 발생하지 않음

 - finally : 무조건 마지막에 실행

 

 (1) try, except문

   - try문 수행 도중 오류가 발생하면 except 문이 수행

try:
	...
except [발생오류[as오류 메시지 변수]]:     ##대괄호[] 안은 생략 가능
	...

  - 예시 1

try:
	4 / 0
except ZeroDivisionError as e:
	print(e)
    
>>> division by zero

 - 예시 2

people = [
            {'name': 'bob', 'age' : 20}
            ...
            ...
            ]

for person in people:
	try:
		if person['age'] >20:
			print(person['name']
	except:
		print(person['name'], '에러입니다')
        
>>> carry
>>> ben
>>> bobby 에러입니다
>>> red
>>> queen

 

  - 여러개의 오류 처리

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

  - 여러개의 오류처리의 경우 try문을 수행하다 먼저 발생한 오류만 출력하고 문을 빠져나온다.

    그러므로 아래 예시와 같이 인덱싱 오류만 출력한다.

try:
	a = [1, 2]
	print(a[3])          ## 인덱싱 오류가 먼저 발생
	3/0
except ZeroDivisionError:
	print("0으로 나눌 수 없습니다.")
except IndexError:
	print("인덱싱 할 수 없습니다.")
    
>>>"인덱싱 할 수 없습니다."

  - 오류 메시지를 아래와 같이 가져올 수도 있다.

try:
	a = [1, 2]
	print(a[3])          ## 인덱싱 오류가 먼저 발생
	3/0
except ZeroDivisionError as e:
	print(e)
except IndexError as e:
	print(e)
    
>>>list index out of range

  - 2개 이상의 오류를 동시에 처리하려면 아래와 같이 괄호를 묶어서 처리한다.

try:
	a = [1, 2]
	print(a[3])
	3/0
except (ZeroDivisionError, IndexError) as e:
	print(e)
    
>>> list index out of range

 

(2) try, finally문

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

f = open('test.txt', 'w')
try:
	...
finally:
	f.close()

(3) pass : 오류 회피하기

try:
	f = open("missing", 'r')
except FileNotFoundError:
	pass                     ## 파일이 없더라도 오류를 발생하지 않고 통과

(4) raise : 오류 발생시키기

## dog클래스를 상속받는 자식클래스는
## 반드시 barking이라는 함수를 구현하도록
## 강제하고 싶은 경우


class dog:                           ## 1) dog 클래스에 
	def barking(self):               ## 2) barking 이라는 함수 생성
    	raise NotImplementedError    ## 3) 함수를 사용하려하면 NotImplementedError 발생

class Bulldog(dog):                  ## 1) bulldog클래스는 dog클래스를 상속받음
	pass

bulldog = Bulldog()
bulldog.barking()

  - 위 예시에서 에러를 발생시키고 싶지 않다면 Bulldog 클래스에 barking 함수를 반드시 구현해야 한다.

class dog:                           ## 1) dog 클래스에 
	def barking(self):               ## 2) barking 이라는 함수 생성
    	raise NotImplementedError    ## 3) 함수를 사용하려하면 NotImplementedError 발생

class Bulldog(dog):                  ## 1) bulldog클래스는 dog클래스를 상속받음
	def barking(self):
    	print("bark, bark")

bulldog = Bulldog()
bulldog.barking()

>>> "bark, bark"

(5) 예외 만들기

  - 에러 발생

class MyError(Exception):
    pass

def say_paul(paul):
    if paul == 'nerd':
        raise MyError()
    print(paul)

say_paul("genius")
say_paul("nerd")

>>> genius
>>> Traceback (most recent call last):
>>>   File "...", line 10, in <module>
>>>     say_paul("nerd")
>>>   File "...", line 6, in say_paul
>>>     raise MyError()
>>> __main__.MyError

 

  - 에러 예외처리 → MyError 클래스

class MyError(Exception):
    pass

def say_paul(paul):
    if paul == 'nerd':
        raise MyError()
    print(paul)

try:
	say_paul("genius")
	say_paul("nerd")
except MyError:
	print("잘못된 별명")

>>> genius
>>> 잘못된 별명

  - 에러 예외처리 → MyError 클래스, 에러 발생시 저장된 오류메시지 사용

 

class MyError(Exception):
    def __str__(self):               ## 오류메시지를 보이게 하려면 __str__메서드 사용
    	return "잘못된 별명"

def say_paul(paul):
    if paul == 'nerd':
        raise MyError()
    print(paul)

try:
	say_paul("genius")
	say_paul("nerd")
except MyError as e:
	print(e)

>>> genius
>>> 잘못된 별명

 

반응형

댓글