Back-End/Python

try, except, finally

pshoon25 2022. 12. 8. 00:32

try, except, finally 

 

위 세 단어는 무엇일까 ?

그것은 바로 파이썬에서 '예외 처리'를 할 때 사용되는 함수이다.


그렇다면 여기서 '예외'란 무엇일까 ?

 

'예외'란,

프로그래밍에서  프로그램 실행 중에 발생되는 의도치 않은 사건을 의미한다.

즉, 프로그램 실행 중에 비정상 종료가 되는 것을 예외가 발생된다고 한다.

 

'예외 처리'는 비정상 종료되는 프로그램을 종료로 처리하는 작업을 의미한다.

단, 예외가 발생한 코드를 수정해주는 것이 아니다.

그러나 예외가 발생한 정보를 알려주는 역할은 할 수 있다.

 

파이썬에서 이러한 예외 처리를 할 수 있는 클래스가 있다.


🔎예제를 통하여 확인해보자 !

print('프로그램 실행')
print('a'+1)
print('프로그램 정상 종료')

# 출력값
# 프로그램 실행
# TypeError: can only concatenate str (not "int") to str

위 코드는 중간에 'a'+1 은 문자열과 정수형의 덧셈은 불가하기 때문에 '예외'가 발생한다.

그래서 첫째줄에 '프로그램 실행'은 정상 출력 되었으나 둘째줄에 예외 발생으로 인하여, 

둘째줄과 셋째줄엔 예외 발생으로 비정상 종료가 되었다.

이러한 경우 셋째줄에 '프로그램 정상 종료' 라는 문구를 출력하고 싶을때는 try, except문을 사용하면 된다.

print('프로그램 실행')
try :
    print(1+1)
except:
    pass   
print('프로그램 정상 종료')

# 출력값
# 프로그램 실행
# 2
# 프로그램 정상 종료

위의 코드 블록을 설명하자면,

try : 문에 있는 <코드 블록>이 정상 수행 된다면 문제 없이 정상 종료가 된다.

print('프로그램 실행')
try :
    print('a'+1)
except:
    pass   
print('프로그램 정상 종료')

# 출력값
# 프로그램 실행
# 프로그램 정상 종료

그러나 <코드 블록>에서 '예외'가 발생한다면,

다음 수행 코드로 넘어가 '프로그램 정상 종료'를 수행하게 된다.

print('프로그램 실행')
try :
    print('a'+1)
except TypeError as t :
    print('Error : ', t)   
print('프로그램 정상 종료')

# 출력값
# 프로그램 실행
# Error :  can only concatenate str (not "int") to str
# 프로그램 정상 종료

except 에는 위와 같이 작성할 수 있다.

except TypeError as t :

TypeError 은 에러의 종류이며, as t는 해당 에러를 변수로 간략하게 나타낸 것이다.

try : 문에서 위의 에러타입이 발생하면 'Error :  can only concatenate str (not "int") to str' 라는 예외가 발생한 정보를 출력하게 된다.

 

그러나 우리는 어떤 타입의 에러가 발생하는지 예측을 할 수 없을 때가 있다.

그럴 경우 아래 코드처럼 except를 중복으로 사용하여 에러 타입을 기재할 수 있다.

print('프로그램 실행')
try :
    print('a'+1)
except ArithmeticError as a :
    print('error 발생', a)
except ConnectionError as c :
    print('error 발생', c)
except BlockingIOError as b :
    print('error 발생', b)
except BaseException as base :
    print('error 발생', base)
print('프로그램 정상 종료')

except의 맨 마지막에는 보통 'BaseException'을 기입한다.

'BaseException'은 '예외 처리' 클래스 중 상단 부모 클래스이기 때문이다.

CLASSES
    object
        BaseException
            Exception
                ArithmeticError
                    FloatingPointError
                    OverflowError
                    ZeroDivisionError
                AssertionError
				...

'예외 처리'의 클래스 구도는 위와 같다.

help(__bulitins__)

위 코드를 수행하면 클래스의 구조를 확인할 수 있다.


🔎마지막으로 finally 문에 대해 알아보자 !

 

finally에 작성하는 <코드 블록>은 '예외'의 발생 여부와 무관하게 무조건 실행된다.

주로, 아래 코드와 같이 file.close() 등 데이터베이스, 네트워크 종료 같은 필수 코드들을 finally 문에 추가한다.

 

f = open('test.py')
print('프로그램 실행')
try :
    print('a'+1)
except ArithmeticError as a :
    print('error 발생', a)
except ConnectionError as c :
    print('error 발생', c)
except BlockingIOError as b :
    print('error 발생', b)
except BaseException as base :
    print('error 발생', base)
finally :
    f.close
print('프로그램 정상 종료')

🎉우리는 '예외 처리' 클래스에 대하여 알아보았다 !🎉

 

정리하자면 아래와 같다.

try :
	<코드 블록>
except <예외 클래스 명> as <변수> :
	<예외 발생시 처리하는 문장>
finally :
	<코드 블록>     # 필수 수행 코드

코드 길이가 짧으면 문제가 되지 않지만,

코드 길이가 길어지고 복잡해지면 오류를 찾는데 많은 시간을 소비하게 될 것이다.

 

이럴 경우, '예외 처리'를 잘 활용하여 유용하고 효율적으로 작성을 할 수 있도록 해보자 !💪

'Back-End > Python' 카테고리의 다른 글

PyAutoGUI  (2) 2022.12.21
class  (0) 2022.12.07
def  (0) 2022.12.05
for, while  (2) 2022.11.27
if  (0) 2022.11.27