이펙티브 파이썬 Item 65. try/except/else/finally의 각 블록을 잘 활용하라

    요약

    • try / except / else / finally절의 용도를 잘 이해하고 사용해라.
      • finally : 예외가 발생하더라도 자원 정리를 해야 할 필요가 있을 때 사용한다. 파일을 닫는 작업
      • else : try가 성공했다고 가정하고 다음 작업을 할 때 사용해라. try에서 발생하는 예외가 무엇인지 범위를 좁혀줄 수 있음.
      • try ~ else를 같이 쓸 때 try는 예외가 발생할 수 있는 부분, else는 예외가 전혀 발생하지 않는 부분으로 나눠주는 용도로도 쓸 수 있음. (명시적으로)
    • 성공흐름 : try → else → finally
    • 실패흐름 : try → except → finally

     

    else 문의 효능

    else는 다음 목적으로 사용한다. 

    • 코드에서 처리할 예외 / 위로 던질 예외를 명확하게 구분할 때 
    • 이런 방식으로도 구분 할 수 있음.
      • try 블록 내에서는 예외가 발생하는 부분을 가리킬 때
      • else 블록 내에서는 예외가 전혀 발생하지 않을 부분을 가리킬 때

    else 블록을 사용하면 try 블록 안에 들어갈 코드를 최소화 할 수 있다. try 블록에 들어가는 코드가 줄어들면 발생할 여지가 있는 예외를 서로 구분할 수 있게 된다. 

    import json
    
    def load_json_key(data, key):
        try:
            print('* JSON 데이터 읽기') 
            result_dict = json.loads(data) # ValueError가 발생할 수 있음.
        except ValueError as e:
            print('* ValueError 처리')
            raise KeyError(key) from e 
        else:
            print('* 키 검색')
            return result_dict[key] # KeyError가 발생할 수 있음.
    
    
    data = '{"foo": "bar",}'
    key = 'foo'
    
    try:
        'bar' == load_json_key(data, key)
    except KeyError as e:
        print(f"Caught an error: {e}")
        if e.__cause__:
            print(f"Original cause: {e.__cause__}")

    위 코드에서 try ~ else 문의 효능을 볼 수 있다. 

    • try 문에서는 ValueError가 발생할 수 있고, 그것을 Except 문에서 처리하는 것을 볼 수 있다.
    • else 문은 바꿔 이야기하면 어떠한 예외도 발생하지 않는 곳 or 이 함수를 호출한 곳으로 올려야 하는 예외가 발생하는 곳으로 볼 수 있을 것이다.

     

    댓글

    Designed by JB FACTORY