본문 바로가기
Python

[Python 기초] 파이썬 예외처리 - finally , raise , StopIteration 에러

by dev수니 2021. 4. 3.
반응형

 

 

 1  finally 문

 

 

예외 여부와 상관없이 무조건 실행해야 하는 구문이다.

 

 

 

# 두 수를 입력받고  나눈 값을 출력하는 프로그램

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try:
     a = int(input("첫번째 정수>"))
     b = int(input("두번째 정수>"))
     print("두 수를 나눈 값은",a/b)
     a = [1,2]
     print(a[3])
     
except Exception as e:
     pass # 특정 에러 발생할 경우 통과, 오류 회피
 
finally:
     print("무조건 실행구문")
 
print("예외 처리 구문")
cs
첫번째 정수>3
두번째 정수>0
무조건 실행구문

try문 실행 후 오류가 발생하더라도 줄9에서 예외처리구문을 만나 pass에 의해 오류를 회피하게 된다.

그리고 finally 구문을 무조건 실행하고 다음 줄14의 코드도 실행되는 것을 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

 2  raise 문

 

 

예외를 일부러 발생 시키는 경우에 사용하는 구문이다.

 

 

 

# 가위바위보 클래스

1
2
3
4
5
6
7
8
9
10
11
12
def rsp(a,b):
     str1 = ["가위","바위","보"]
     if a not in str1:
       raise ValueError
     if b not in str1:
       raise ZeroDivisionError
try:
     rsp("가위","바")
except ValueError:
     print("값이 잘못되었습니다. ValueError")
except ZeroDivisionError:
     print("값이 잘못되었습니다. ZeroDivisionError")
cs
값이 잘못되었습니다. ZeroDivisionError
>>> 

 

 

 

 

 

 

 

 

 

 

 

 3  StopIteration 에러

 

 

반복문을 중간에 종료하면 발생하는 예외이다.

 

 

 

 

# 1반에 키를 저장하는 딕셔너리
# 2반에 키를 저장하는 딕셔너리

# 190이 넘는 학생을 발견하면 반복을 종료하고 예외 발생시키기

# 예외처리구문 : 1,2반에 190 넘는 학생이 있습니다. 

1
2
3
4
5
6
7
8
9
10
school = {"1반":[150,160,170,180,190]
          ,"2반":[190,150,170,160,199]}
try:
     for number,stu in school.items():
          for s in stu:
               if s > 190:
                    print(number,"190넘는 학생이 있습니다.")
                    raise StopIteration
except StopIteration:
     print("StopIteration발생 정상종료")
cs
2반 190넘는 학생이 있습니다.
StopIteration발생 정상종료

먼저 try문으로 실행해줄 구문을 작성해준다. for문을 이용해 key값과 value값을 각각 변수 number와 stu에 items() 함수를 이용해 담고 for문을 이용해 stu에 담아준 value값 중에서 190이 넘으면 StopIteration 을 발생시키고

그것을 except 구문으로 예외처리해준다.

 

그러면 190이상의 value값을 만났을 때 except구문이 실행된다.

 

 

 

 

 

 

 

 

 

 

 

 4  사용자 예외 만들기

 

 

Exception 클래스를 이용하여 사용자가 직접 예외를 만드는 구문이다.

어떤 예외에 대한 클래스를 만들때 Exception 클래스로 부터 상속받아 작성하면된다.

 

 

 

 

# 다음 Exception 클래스를 상속받아 만든 예외처리 프로그램이다.

1
2
3
4
5
6
7
8
9
10
class MyError(Exception):
     def __init__(self,value):
          self.value = value
     def __str__(self):   # 문자열로 반환해주는 메서드
          return self.value
try:
     raise MyError("직접만든 오류!")
except Exception as e:
     print(e)
     print(type(e))
cs
직접만든 오류!
<class '__main__.MyError'>
>>>

Exception 클래스의 요소들을 MyError로 상속받아 사용하겠다.
그리고 줄2에서 클래스의 생성자를 통해 value값을 받고 인스턴스 변수에 그 값을 저장한다.
그리고나서 줄4에서 그 값을 __str__메서드를 통해 문자열로 반환한다.
그리고 줄6 실행구문에 MyError 클래스를 실행해주고 이 실행 구문을 raise로 일부러 에러발생시킨다.
그리고 줄8에서 Exception 클래스로 예외처리 해준다.
예외처리로 받은 e값의 타입을 검사해본 결과 받은 결과 클래스타입이고 사용자가 정의해 준 MyError 클래스인 것을 알 수 있다.

 

 

 

 

 

 

 

 

반응형

댓글