새소식

반응형
Programming Language/Python

[Python] 파이썬 try except 예외 처리

  • -
반응형

파이썬뿐만 아니라 프로그래밍을 하면서 에러가 발생할 경우 프로그램이 중지되는 상황을 다들 한 번씩 겪어봤을 것이다. 하지만 에러가 발생하더라도 프로그램이 중지되질 원하지 않을 경우 파이썬에선 try except구문을 사용하면 되는데 오늘은 try except구문에 대해 다양한 예제로 사용법을 알아보자.
 
 

1. 파이썬에서 예외를 처리하는 방법


1.1 에러가 발생했을 때 프로그램의 종료시점

먼저 에러가 발생할 코드를 작성해 보자.

print("==== Program begins ====")

x = int('Jack') # 에러가 발생하는 지점
print(f'my name is {x}')

print("==== Program Ends ====")

'Jack'이라는 문자열을 정수형으로 형변환할 수 없기 때문에 x = int('Jack') 라인에서 에러가 발생할 것이다.
 

==== Program begins ====
Traceback (most recent call last):
  File "i:\github\Python\note\note.py", line 3, in <module>
    x = int('Jack') # 에러가 발생하는 지점
        ^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'Jack' 
PS I:\github\Python>

실행결과
 

위의 실행결과에서 알 수 있듯이 파이썬에선 따로 try except문을 사용하지 않으면 에러가 발생한 지점에서 프로그램이 종료되는 것을 확인할 수 있다.
 

1.2 try except문을 사용하여 에러가 발생해도 프로그램이 종료되지 않게 하기

실제로 사용자가 직접 사용하는 프로그램에서 에러가 발생했을 때 프로그램이 죽도록 코드를 작성한다면 큰일이 날  수도 있는 상황이다. 그렇기에 개발자는 에러가 발생할 만 곳에서 에러가 발생하더라도 다른 방향으로 프로그램이 흐르게 코드를 작성해야 한다. 그리고 그것을 예외처리라고 하는데 프로그램이 에러 발생에 의해 죽는 것을 방지하기 위함이다.
 
위의 코드를 그대로 가져와서 try, except구문을 이용해서 예외처리를 해보자.

print("==== Program begins ====")

try:
    x = int('Jack') # 에러가 발생하는 지점
    print(f'my name is {x}')
except:
    print("==== Error, but program is still alive")

print("==== Program Ends ====")

위의 코드를 보면 try와 except문을 어떻게 사용하는지 감이 올 것이다. try문 안에 에러가 발생하는 혹은 발생할 것으로 예상되는 코드를 작성하면 되고 except 구문에서는 에러가 발생했을 때 처리할 코드를 작성해 주면 된다. 따라서 위의 코드를 실행할 경우 아래와 같은 결과를 확인할 수 있을 것이다.

==== Program begins ====
==== Error, but program is still alive
==== Program Ends ====

실행결과
 

여기서 주의 깊게 봐야 할 점은 x = int('Jack') 코드가 실행되면서 해당 지점에서 에러가 발생하고 바로 except 구문으로 넘어간다는 점이다. 그래서 x = int('Jack') 다음에 오는 코드는 실행되지 않는다.
 

2. try, except, else, finally


2.1 try, except, else 구문 사용법

try, except, else구문은 위의 try, except구문에서 except 다음에 else구문을 추가한 것이다. try 구문 안에서 에러가 발생하게 된다면 except 구문안에 코드가 실행되지만 에러가 발생하지 않는다면 else 구문으로 이동해 그 안에 코드를 실행할 것이다.
 

print("==== Program begins ====")

try:
    x = int('29') 
    print(f'my age is {x}')
except:
    print("==== Error, but program is still alive ====")
else:
    print('==== Error가 발생하지 않았습니다. ====')

print("==== Program Ends ====")

위의 예시에서 코드를 그대로 가져와 x = int('29')로 에러가 발생하지 않게 변경하고 else구문을 추가해 보았다. 해당 코드를 실행했을 경우 결과가 어떻게 나오는지 한 번 살펴보자.
 
 

==== Program begins ====
my age is 29
==== Error가 발생하지 않았습니다. ====
==== Program Ends ====

실행결과
 

예외가 발생하지 않았으니 당연히 try 구문 안에 있는 코드가 모두 실행되고 else 구문으로 넘어가 그 안에 있는 코드를 실행한다.
 

2-2 try, fianlly 구문

finally 구문은 에러의 발생여부와 상관없이 무조건 실행되는 구문이다. 만약 except를 제외하고 try finally 구문만 사용할 시 에러가 발생한 후에 finally 구문까지만 실행되고 프로그램은 중간에 종료될 것이다.
 

print("==== Program begins ====")

try:
    x = int('Jack') 
    print(f'my name is {x}')
finally:
    print("==== FINALLY ====")

print("==== Program Ends ====")
==== Program begins ====
==== FINALLY ====

실행결과
 

결과를 보면 x = int('Jack')의 코드가 실행되면서 에러가 발생하고 프로그램이 종료되어야 하는데 finally 구문 안에 있는 코드가 실행되고 프로그램이 종료된 것을 확인할 수 있다.
 
finally 구문을 주로 많이 사용하는 경우가 파일 닫기이다. 오픈한 파일이 에러가 발생하든 발생하지 않든 무조건 닫아야 하는 경우에 finally 구문 안에 파일을 닫는 코드를 작성해야 한다.
 

2.3 try, except, finally

여기까지 읽으신 분이라면 이제 try, except, finally의 역할에 대해서 알고 있을 것이라고 믿는다, 그렇다면 이 3개의 구문을 모두 사용하면 어떻게 코드가 실행되는지 한번 살펴보자.

print("==== Program begins ====")

try:
    x = int('Jack') 
    print(f'my name is {x}')
except:
    print("==== except ====")
finally:
    print("==== FINALLY ====")

print("==== Program Ends ====")
==== Program begins ====
==== except ====      
==== FINALLY ====     
==== Program Ends ====

실행결과

 
결과를 보면 x = int('Jack')에서 에러가 발생하고 그 이후에 있는 코드 print(f'my name is {x}')를 생략하고 except 구문으로 넘어간다, 그리고 에러 발생여부와 상관없이 무조건 동작하는 finally 구문으로 넘어가 코드를 실행하게 되고 모든 구문을 빠져나와 print("==== Program Ends ====") 코드를 실행하고 프로그램이 종료된다.
 

2.4 try, except, else, finally

마지막으로 지금까지 배운 모든 구문을 사용하면 어떻게 될까? 이번 예제는 에러가 발생하는 코드와 발생하지 않는 코드 2개를 살펴보자.
 
• 에러가 발생하는 코드

print("==== Program begins ====")

try:
    x = int('Jack') 
    print(f'my name is {x}')
except:
    print("==== except ====")
else:
    print('==== 에러는 발생하지 않았습니다. ====')
finally:
    print("==== FINALLY ====")

print("==== Program Ends ====")
==== Program begins ====
==== except ====      
==== FINALLY ====     
==== Program Ends ====

실행결과

 
 
• 에러가 발생하지 않는 코드

print("==== Program begins ====")

try:
    x = int('29') 
    print(f'my age is {x}')
except:
    print("==== except ====")
else:
    print('==== 에러는 발생하지 않았습니다. ====')
finally:
    print("==== FINALLY ====")

print("==== Program Ends ====")
==== Program begins ====
my age is 29
==== 에러는 발생하지 않았습니다. ====        
==== FINALLY ====     
==== Program Ends ====

실행결과

 
위의 결과를 보면 기본적으로 예외처리를 하기 위해선 try와 except 구문은 필수적이다. 선택적으로 예외가 발생하지 않는 상황에서 별도로 다른 코드를 실행시키려면 else 구문을 사용하면 되고 예외가 발생하든 발생하지 않든 try 구문이 종료되고 반드시 실행되어야 하는 코드가 있다면 finally 구문안에 작성해 주면 된다.
 
 

정리


try - 에러가 발생할 거 같은 코드를 작성(필수)
except - 에러가 발생했을 경우 실행하고자 하는 코드 작성(필수)
else - 에러가 발생하지 않았을 때 별도로 수행하고 싶은 코드 작성(선택)
finally - 에러 발생여부와 상관없이 try 구문 안에 있는 코드가 끝나고 실행되어야 하는 코드 작성(선택)

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.