Python3에서는 try except
구문을 활용하여 예외를 처리할 수 있다.
이와 비슷한 구문을 가진 언어도 많다.
Java, JavaScript, C++, php 등등의 언어에서는 try catch
구문을 지원한다.
Python3에서의 try except finally
는 여타 언어에서의 try catch finally
와 거의 동일하다.
sample = {"key1": 1}
try:
value2 = sample["key2"]
print("try here")
except KeyError:
value2 = 0
print("Error!")
finally:
print("FINALLY!")
print("After handler")
#출력
Error!
FINALLY!
After handler
Python3에서 try except finally
는 이런 구조다.
매우 간단하다.
try
문에서 sample
dictionary에 존재하지 않는 키를 접근한다.
KeyError
가 발생하고, 때문에 KeyError
를 핸들링하는 except
문으로 넘어간다.
그리고 마지막으로 finally
문이 실행되고 나와서 계속 프로세스는 진행된다.
그런데 다른 언어와 다른 기능이 하나 더 있다.
바로 else
문이다.
(은근히 Python에서 else
문이 여기저기 사용되는 듯하다. for
문에도 else
문이 사용될 수 있다는 걸 저번주에 알았다...)
sample = {"key1": 1}
try:
value1 = sample["key1"]
print("try here")
except KeyError:
value2 = 0
print("Error!")
else:
print("value2 assigned!")
finally:
print("FINALLY!")
print("After handler")
#출력
try here!
value2 assigned!
FINALLY!
After handler
코드를 살짝 수정했다.
else
문은 try
문에서 에러나 예외가 발생하지 않았을 때만 진입하게 된다.
단, else
문은 except
문이 없으면 안된다.
try:
print("hello")
else:
print("world")
이렇게 쓸 수 없다는 뜻.
그냥 try except
문으로 처리하면 될 것을, 무엇하러 else
문이 있는 건가?
수도 코드를 하나 짜보겠다.
get_data()
라는 함수로 데이터를 가져오고,
parse()
라는 함수로 가져온 데이터를 파싱하는 작업이다.
이 때, get_data()
함수에서 예외가 발생할 수 있다고 가정하자.
try:
my_data = get_data()
parsed_data = parse(my_data)
except:
parsed_data = None
return parsed_data
여기에 else
문을 더해보겠다.
try:
my_data = get_data()
except:
parsed_data = None
else:
parsed_data = parse(my_data)
return parsed_data
else
문으로 하여금 어떤 부분에서 예외 처리를 하려는 것인지 분명히 할 수 있다.
Python3 tutorial - Exception handling을 인용하자면,
The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try … except statement.
아까의 예시 코드를 재활용해보자.
단, 여기서는 get_data()
와 parse()
두 함수에서 모두 IOError
가 발생할 수 있다고 가정한다.
try:
my_data = get_data()
parsed_data = parse(my_data)
except IOError:
parsed_data = None
return parsed_data
get_data()
와 parse()
에서 발생할 수 있는 IOError
를 모두 처리해줄 수 있다.
만약, parse()
에서 발생하는 예외는 처리하기 싫다면?
그 때 else
를 써야한다.
try:
my_data = get_data()
except IOError:
parsed_data = None
else:
parsed_data = parse(my_data)
return parsed_data
아래처럼 parsed_data = parse(my_data)
를 아예 예외 처리문에서 꺼내놓으면 되지 않느냐라고 하신다면,
try:
my_data = get_data()
except IOError:
parsed_data = None
parsed_data = parse(my_data)
return parsed_data
예외가 발생했을 경우 my_data
는 정의되지 않은 이름이기 때문에 NameError
가 발생한다.