프로그래밍 언어/Python

Python의 try-except-else문

Rateye 2021. 12. 13. 00:32
728x90
반응형
질문 : Python에서 try-except-else를 사용하는 것이 좋은 습관입니까?

때때로 파이썬에서 나는 블록을 본다.

try:
   try_this(whatever)
except SomeException as exception:
   #Handle exception
else:
   return something

try-except-else가 존재하는 이유는 무엇입니까?

나는 흐름 제어를 수행하기 위해 예외를 사용하기 때문에 그런 종류의 프로그래밍을 좋아하지 않습니다. 그러나 그것이 언어에 포함되어 있다면 그에 대한 정당한 이유가있을 것입니다.

예외는 오류가 아니며 예외적 인 조건 (예 : 디스크에 파일을 쓰려고하는데 더 이상 공간이 없거나 권한이 없을 수 있음)에만 사용해야하며 흐름을 위해서가 아니라는 점을 이해합니다. 제어.

일반적으로 예외를 다음과 같이 처리합니다.

something = some_default_value
try:
    something = try_this(whatever)
except SomeException as exception:
    #Handle exception
finally:
    return something

또는 예외가 발생해도 아무것도 반환하지 않으려면 다음을 수행하십시오.

try:
    something = try_this(whatever)
    return something
except SomeException as exception:
    #Handle exception
답변

"무지에서 나온 것인지는 모르겠지만, 흐름 제어를 수행하기 위해 예외를 사용하기 때문에 그런 종류의 프로그래밍이 마음에 들지 않습니다."

Python 세계에서 흐름 제어에 예외를 사용하는 것은 일반적이며 정상입니다.

Python 핵심 개발자조차도 흐름 제어를 위해 예외를 사용하며 해당 스타일은 언어에 크게 적용됩니다 (즉, 반복기 프로토콜은 StopIteration 을 사용하여 루프 종료 신호를 보냅니다).

또한 try-except-style은 일부 "도약하기 전에보기" 구조에 내재 된 경쟁 조건을 방지하는 데 사용됩니다. 예를 들어, os.path.exists 를 테스트하면 정보를 사용할 때까지 최신 정보가 아닐 수 있습니다. 마찬가지로 Queue.full 은 오래되었을 수있는 정보를 반환합니다. 이러한 경우 try-except-else 스타일 은보다 안정적인 코드를 생성합니다.

"예외는 오류가 아니라 예외적 인 조건에만 사용해야한다는 것을 이해합니다."

일부 다른 언어에서는이 규칙이 도서관에 반영된 문화적 규범을 반영합니다. 또한 "규칙"은 해당 언어에 대한 성능 고려 사항을 부분적으로 기반으로합니다.

파이썬의 문화적 규범은 다소 다릅니다. 대부분의 경우 제어 흐름에 예외를 사용해야합니다. 또한 Python에서 예외를 사용하면 일부 컴파일 된 언어 에서처럼 주변 코드와 호출 코드가 느려지지 않습니다 (즉, CPython 은 실제로 예외를 사용하는지 여부에 관계없이 모든 단계에서 예외 검사를위한 코드를 이미 구현합니다).

즉, "예외는 예외적 인 것"이라는 이해는 다른 언어에서는 의미가 있지만 Python에서는 의미가 없습니다.

"그러나 그것이 언어 자체에 포함된다면 그에 대한 정당한 이유가있을 것입니다. 그렇지 않습니까?"

경쟁 조건을 피하는 것 외에도 예외는 루프 외부에서 오류 처리를 가져 오는 데 매우 유용합니다. 이것은 자동 루프 불변 코드 모션 을 갖지 않는 경향이있는 해석 언어에서 필요한 최적화입니다.

또한 예외는 문제가 발생한 위치에서 문제를 처리 할 수있는 능력이 멀리 떨어져있는 일반적인 상황에서 코드를 상당히 단순화 할 수 있습니다. 예를 들어, 비즈니스 로직에 대한 코드를 호출하는 최상위 레벨 사용자 인터페이스 코드를 갖는 것이 일반적이며, 이는 차례로 하위 레벨 루틴을 호출합니다. 하위 수준 루틴에서 발생하는 상황 (예 : 데이터베이스 액세스의 고유 키에 대한 중복 레코드)은 최상위 코드에서만 처리 할 수 있습니다 (예 : 기존 키와 충돌하지 않는 새 키를 사용자에게 요청). 이러한 종류의 제어 흐름에 예외를 사용하면 중간 수준의 루틴이 문제를 완전히 무시하고 흐름 제어의 측면에서 멋지게 분리 될 수 있습니다.

여기에 예외의 필수성에 대한 멋진 블로그 게시물이 있습니다.

또한이 스택 오버플로 답변을 참조하십시오. 예외는 정말 예외적 인 오류입니까?

"예외 시도가 존재하는 이유는 무엇입니까?"

else 절 자체는 흥미 롭습니다. 예외가 없을 때가 마지막 절 이전에 실행됩니다. 이것이 주요 목적입니다.

else-clause가 없으면 종료 전에 추가 코드를 실행할 수있는 유일한 옵션은 try-clause에 코드를 추가하는 서투른 관행입니다. try-block에 의해 보호되도록 의도되지 않은 코드에서 예외가 발생할 위험이 있기 때문에 서투른 것입니다.

마무리 전에 추가로 보호되지 않은 코드를 실행하는 사용 사례는 자주 발생하지 않습니다. 따라서 게시 된 코드에서 많은 예제를 기대하지 마십시오. 다소 드뭅니다.

else 절의 또 다른 사용 사례는 예외가 발생하지 않을 때 발생해야하고 예외가 처리 될 때 발생하지 않는 작업을 수행하는 것입니다. 예를 들면 :

recip = float('Inf')
try:
    recip = 1 / f(x)
except ZeroDivisionError:
    logging.info('Infinite result')
else:
    logging.info('Finite result')

unittest 러너에서 또 다른 예가 발생합니다.

try:
    tests_run += 1
    run_testcase(case)
except Exception:
    tests_failed += 1
    logging.exception('Failing test case: %r', case)
    print('F', end='')
else:
    logging.info('Successful test case: %r', case)
    print('.', end='')

마지막으로 try-block에서 else-clause의 가장 일반적인 사용은 약간의 미화 (같은 수준의 들여 쓰기에서 예외적 인 결과와 예외가 아닌 결과를 정렬)를위한 것입니다. 이 사용은 항상 선택 사항이며 반드시 필요한 것은 아닙니다.

출처 : https://stackoverflow.com/questions/16138232/is-it-a-good-practice-to-use-try-except-else-in-python
728x90
반응형