[Python3] try except else finally

SangHun·2021년 9월 24일
0
post-custom-banner

예외 처리

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는 이런 구조다.

매우 간단하다.

  1. try문에서 sample dictionary에 존재하지 않는 키를 접근한다.

  2. KeyError가 발생하고, 때문에 KeyError를 핸들링하는 except문으로 넘어간다.

  3. 그리고 마지막으로 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문이 있는 건가?

what 'else'??

1. 가독성, 명시성

수도 코드를 하나 짜보겠다.
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문으로 하여금 어떤 부분에서 예외 처리를 하려는 것인지 분명히 할 수 있다.

2. 의도적으로 예외 처리하지 않기

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가 발생한다.

profile
개발괴발자
post-custom-banner

0개의 댓글