본문으로 바로가기

Python: Try & Exception

category Programming/Python 2021. 1. 22. 19:17
반응형

이터레이터나 제네레이터가 더 이상 반환할 데이터가 없는 상태에서 next 함수 호출이 되었을 때, 파이썬 인터프리터는 StopIteration이라는 에러 메시지 반환과 함께 프로그램의 실행을 정지한다는 내용을 글로 올렸던 적이 있다. (Function 04 참조)

2021/01/19 - [Programming/Python] - Python: Function (4)

 

프로그램이 실행되는 과정에서 이렇게 에러 메시지와 함께 동작이 멈춘다는 것은 이 프로그램에 버그가 있고, 그 버그를 확실히 처리할 수 있도록 알려준다는 점에서 충분한 가치가 있다. 하지만, 문제가 되는 프로그램의 코드만 실행을 스킵하고, 문제가 있음을 알려주도록 만든다면 그것 또한 여러모로 유익한 기능이 될 수 있다고 생각한다.

이 글의 주제에 살짝 빗나가는 내용이긴 하지만, 이터레이터와 제네레이터에 관한 내용을 언급한 김에 이야기하자면, next 함수 자체가 StopIteration 에러 방지를 위한 기능을 가지고 있다. 지금까지의 예제 프로그램에서는 next 함수에 이터레이터 혹은 제네레이터를 단독으로 사용하였지만, 위 그림과 같이 이터레이터나 제네레이터와 함께 특정 데이터 혹은 문자열을 전달하면 StopIteration 에러가 발생하는 상황에서 에러 없이 프로그램을 처리할 수 있다.

이렇게 next 함수에서 제공하는 기능을 이용하면 에러가 발생하는 상황을 예외 처리함으로써 프로그램이 중단되는 것을 막을 수 있지만, 언제 어디에서 예외 상황이 발생하는지 알 수 없으므로, 모든 next 함수마다 예외 처리를 위한 데이터 혹은 문자열을 항상 기입하여야 한다는 불편함도 함께 가지고 있다.

이런 불편함이라도 예외 처리를 위한 기능을 가지고 있다면 그나마 다행이다. 하지만, 위 그림처럼 에러는 다양한 상황에서 발생할 수 있고, next 함수에서와 같이 특별한 예외 처리 방식을 내포하지 못하는 경우가 많으므로, 또 다른 방식의 예외 처리가 필요하다고 말할 수 있다.

파이썬은 이런 예외 처리를 위해 TryExcept를 지원한다. 사실, 이 두 키워드는 여러 많은 프로그래밍 언어에서 제공하는 기능으로, try 아래의 코드를 실행할 때 에러가 있는지를 확인하고, 에러가 있다면 except 아래의 블록을 실행한다. 그래서, 위 그림을 보면, 리스트의 원소를 참조하는 iIndex가 리스트의 범위 안에 있는 경우에는 try 블록의 print 함수를 실행하고, 범위 밖의 원소를 참조하는 경우 IndexError 대신 except 블록의 코드를 실행한 것이다.

단순히 예외 처리를 위한 용도라면, 위 그림과 같이 try와 except 조합만으로도 충분히 그 역할을 다 할 수 있다. 하지만, 에러 발생에 의해 프로그램이 정지되는 것을 막기 위해 예외 처리 코드를 추가하는 것이 아니므로, 프로그램이 실행되는 동안 어떤 에러가 발생해서 예외 처리가 되었는지 확인하는 과정도 반드시 필요하다.

위 그림과 같이, 프로그램 내부에 정의된 리스트에서 원하는 원소의 인덱스 값을 입력 받아 출력해주는 간단한 프로그램을 생각해보자. 프로그램이 실행되었을 때, liTemp 리스트의 범위 안의 인덱스 값이 그림처럼 입력되었다면, 이 프로그램은 아무런 에러 없이 정상적으로 동작을 완료할 것이다.

하지만, 위 그림과 같이 범위 밖의 인덱스나 숫자 대신 문자가 입력된다면, 프로그램은 에러 메시지와 함께 종료된다. 앞에서의 예처럼, 단순 예외 처리를 통해서도 잘못된 데이터가 입력되었음을 사용자에게 알려줄 수 있다. 그러나, 어떤 종류의 오류인지를 나름대로 구분해서 알려줄 수 있다면, 좀 더 효율적인 프로그램이 될 수 있다는 것도 사실이다. 그림에서 알 수 있듯이, 상황에 따라 출력되는 에러 메시지도 다양하니까...

위 그림은 발생할 수 있는 에러 종류에 따라 다양한 루틴으로 예외 상황을 처리하도록 작성된 프로그램과 실행 결과를 보여주고 있다. 사용 방법은 이전의 예외 처리와 유사하고, excpet 다음에 대응할 에러 종류를 정의하는 부분이 다르다.

다시 말해, except 다음에 에러 종류를 기입하면, 해당하는 에러에 대한 예외 처리 루틴을 정의할 수 있다. 그리고, Exception을 사용하면 위에서 정의되지 않은 모든 에러에 대한 예외 처리를 정의할 수 있다.

 

반응형

'Programming > Python' 카테고리의 다른 글

Python: Class02  (0) 2021.01.25
Python: Class01  (0) 2021.01.24
Python: Function (5)  (0) 2021.01.20
Python: Function (4)  (0) 2021.01.19
Python: Function (3)  (0) 2021.01.17