Coding & Programming/Python 기초(A-Z)

[Python:파이썬:기초] 20. 예외 처리(try, except, finally, raise examples)

mainCodes 2021. 6. 4. 21:08

[Python:파이썬:기초] 20. 예외 처리(try, except, finally, raise examples)

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

 

파이썬은 프로그램 오류에 대한 예외처리를 위해 try...except...finally문과 raise문을 지원합니다. try 문은 오류 발생 가능성이 있는 코드를 테스트할 수 있게 해 주며 except 문은 발생한 에러를 처리할 수 있게 해 줍니다.  finally 문의 코드는 try...except와 관계없이 실행됩니다. 

 

※ 참고: 빌트인 예외(Built-in Exceptions):
    https://docs.python.org/3/library/exceptions.html 

 

다음은 try, except, finally문의 기본 구조입니다.

 

try:
    코드1
except 예외 as 오류 변수
    코드2
finally:
    코드3

 

예제는 다양한 형태의 예외처리의 예를 보여줍니다. 잠재적 또는 오류 발생 가능성이 있는 코드를 try문에 포함시킨다는 것을 기억해 두세요.

 

🔗 예외처리 예제(try, except, finally, raise examples):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#예제1) a변수 a가 선언되지 않아 예외가 발생하여 except문 실행
print("\n>> 예제1) try, except 테스트:예외 있음")
try:
    print(a)
except:
    print("예외 발생")
        
#예제2) a변수가 선언되지 않아 try, 첫번째 except만 실행
print("\n>> 예제2) try, except, except 테스트:예외 있음")
try:
  print(a)
except NameError as e:  #빌트인 예외 처리
    print(e)
    print("예외: 변수가 선언되지 않았습니다.")
except:
    print("예외: 다른 문제가 발생하였습니다.")        
  
#예제3)  
print("\n>> 예제3) try, except, except 테스트:예외 있음")
= 20
= 0
try:
    b / c
except ZeroDivisionError as e:  #빌트인 예외 처리
    print(e)
    print("예외: 정수 ",b,"를",c,"로 나누려 했습니다.")
except:
    print("예외: 다른 문제가 발생하였습니다.")          
  
#예제4) 예외 발생이 없으면 try, else문만 실행 #1
print("\n>> 예제4) try, except, else 테스트:예외 없음")
try:
    print("Hello")
except:
    print("예외가 발생하였습니다.")
else:
    print("아무런 에러가 발생하지 않았습니다.")  
  
#예제5) 예외 발생이 없으면 try, else문만 실행 #2  
print("\n>> 예제5) try, except, else 테스트:예외 없음")
try:
    a = int(input("정수를 입력하세요:"))
except:
    print("예외가 발생하였습니다.")
else:
    if a < 100:
        print("입력한 수는 100보다 작은 수 입니다.")
    else:
        print("입력한 수는 100보다 큰 수 입니다.")
 
#예제6) finally문은 예외 발생과 관련없이 항상 실행됨
print("\n>> 예제6) try, except, finally 테스트:예외 있음")
try:
    print(d)
except:
    print("예외가 발생하였습니다.")
finally:
    print("try, except 구문이 종료되었습니다.")
  
#예제7) 파일 핸들링을 위한 try, except, finally 사용 예
print("\n>> 예제7) 파일 핸들링 예외 처리")
try:
    f = open("c:/temp/maincodes1.txt""w")
    f.write("maincodes.tistory.com")
except:
    print("예외 : 파일 쓰기 에러")
finally:
    f.close()  
    print("f.close(): 파일을 close 하였습니다.")
 
 
#예제8) raise 문을 이용하여 오류 발생시키기(프로그램 중단됨)
print("\n>> 예제8) raise 문으로 예외 발생시키기.")
= 10
if a < 100:
  raise Exception("입력한 수가 0보다 작습니다.")
 
#예제9)
= "exception example"
if not type(a) is int:
  raise TypeError("정수만 입력해야 합니다.")
 
print("안녕! "#예외로 중단되어 실행 안 됨
cs

 

🔗 실행결과(Output):

예제 1)은 a라는 이름의 변수를 사용하지 않고 사용하였기 때문에 예외가 발생하여 except문이 실행됩니다.

예제 2)도 마찬가지로 a변수가 선언되지 않아 예외가 발생한 것은 동일합니다. 차이점은 except 문에 발생한 예외 즉 파이썬 내장 예외(built-in exception)를 지정하고 as 이후에 오류 메시지 변수를 사용한 것이 다릅니다.

 

예제 3)은 정수 20을 0으로 나누었기 때문에 예외가 발생한 것으로 빌트인 예외인 ZeroDivisionError의 사용을 보여줍니다.

예제 4)와 예제 5)는 try문에서 발생한 오류가 없어 예외가 발생하지 않습니다. 이 경우 else문의 코드가 실행됩니다.

 

예제 6)은 finally문을 위한 예제입니다. 선언되지 않은 변수 d를 사용하여 예외가 발생하였지만 finally문은 예외 발생과 상관없이 호출된다는 것을 확인할 수 있습니다.

예제 7)은 파일 핸들링을 예를 들었는데, 만약 c:/temp/maincodes1.txt에 파일이 존재한 상태에서 다음과 같이 코드를 일부 변경한다면,

 

f = open("c:/temp/maincodes1.txt", "r") 

 

읽기 모드로 열고 f.write()를 하였기에 예외가 발생합니다. 만약, 아래와 같이 변경한다면,

 

f = open("c:/temp/maincodes200.txt", "r")

 

c:/temp에 maincodes200.txt 파일이 존재하지 않기 때문에 예외는 물론이고, f.close()에서 f가 선언되지 않은 것으로 오류가 발생합니다.

 

예제 8)과 예제 9)는 raise 문에 대한 예제로 raise문은 개발자가 의도적으로 예외를 발생시키고자 할 때 사용되며 예외 발생 후 프로그램은 중단됩니다.

 

이 외 Exception 클래스를 베이스 클래스로 하여 사용자 예외 클래스를 만들어서 예외를 발생시킬 수 있습니다.

class testExcept(Exception):
     코드

이상 JollyTree였습니다 (•̀ᴗ•́)و