파이썬

[python] 한 줄에 여러 예외 잡기(블록 제외)

zooheon 2022. 8. 21. 22:37
반응형

나는 내가 할 수 있다는 것을 안다:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

나는 또한 이것을 할 수 있다:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

그러나 두 가지 다른 예외 내에서 동일한 작업을 수행하고 싶다면 지금 당장 생각할 수 있는 최선은 다음과 같습니다.

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

다음과 같은 작업을 수행할 수 있는 방법이 있습니까 say please?

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

이제 다음 구문과 일치하므로 실제로 작동하지 않습니다.

try:
    # do something that may fail
except Exception, e:
    # say please

따라서 두 가지 별개의 예외를 잡으려는 나의 노력은 정확히 이루어지지 않습니다.

이 작업을 수행할 수 있는 방법이 있습니까?

 

파이썬 문서 에서 :

예외 절은 예를 들어 괄호로 묶인 튜플로 여러 예외의 이름을 지정할 수 있습니다.

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

또는 Python 2 전용:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

예외를 변수에서 쉼표로 구분하는 것은 Python 2.6 및 2.7에서 계속 작동하지만 이제는 더 이상 사용되지 않으며 Python 3에서는 작동하지 않습니다. 이제 를 사용해야 합니다 as.

 

한 줄에 여러 예외를 잡는 방법(블록 제외)

이 작업을 수행:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

오류 개체를 이름에 할당하기 위해 쉼표를 사용한 이전 구문 때문에 괄호가 필요합니다. 키워드 는 as할당에 사용됩니다. 오류 개체에는 아무 이름이나 사용할 수 있습니다. 저는 error개인적으로 선호합니다.

모범 사례

현재 Python과 호환되는 방식으로 이를 수행하려면 예외를 쉼표로 구분하고 괄호로 묶어 예외 인스턴스를 변수 이름에 할당한 이전 구문과 구별해야 합니다. 반점.

다음은 간단한 사용법의 예입니다.

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    sys.exit(0)

버그를 숨기지 않기 위해 이러한 예외만 지정하고 있습니다. 버그가 발생하면 전체 스택 추적이 예상됩니다.

여기에 문서화되어 있습니다: https://docs.python.org/tutorial/errors.html

예외를 변수에 할당할 수 있습니다( e일반적이지만 긴 예외 처리가 있거나 IDE가 내 것처럼 더 큰 선택 항목만 강조 표시하는 경우 더 자세한 변수를 선호할 수 있습니다.) 인스턴스에는 args 속성이 있습니다. 다음은 예입니다.

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    sys.exit(0)

Python 3에서는 블록이 종료 err될 때 객체가 범위를 벗어납니다 .except

더 이상 사용되지 않음

오류를 쉼표로 지정하는 코드를 볼 수 있습니다. Python 2.5 및 이전 버전에서 사용할 수 있는 유일한 형식인 이 사용법은 더 이상 사용되지 않으며 코드가 Python 3에서 이전 버전과 호환되도록 하려면 새 형식을 사용하도록 구문을 업데이트해야 합니다.

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    sys.exit(0)

코드베이스에 쉼표 이름 할당이 표시되고 Python 2.5 이상을 사용하는 경우 업그레이드할 때 코드가 호환 가능한 상태로 유지되도록 새로운 방법으로 전환하십시오.

컨텍스트 suppress관리자

허용되는 답변은 실제로 최소 4줄의 코드입니다.

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

, try, 줄은 Python 3.4에서 사용할 수 있는 억제 컨텍스트 관리자를 사용except 하여 한 pass줄로 처리할 수 있습니다 .

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

pass따라서 특정 예외 를 원할 때 suppress.

 

Python 문서 에서 -> 8.3 예외 처리 :

문 에는 try다른 예외에 대한 처리기를 지정하기 위해 둘 이상의 except 절이 있을 수 있습니다. 최대 하나의 핸들러가 실행됩니다. 핸들러는 동일한 try 문의 다른 핸들러가 아니라 해당하는 try 절에서 발생하는 예외만 처리합니다. 예외 절은 여러 예외를 괄호로 묶인 튜플로 명명할 수 있습니다. 예를 들면 다음과 같습니다.

except (RuntimeError, TypeError, NameError):
    pass

이 튜플 주위에 괄호가 필요하다는 점에 유의하십시오. 예외 ValueError, e:는 일반적으로 except ValueError as e:현대 Python(아래 설명)에서와 같이 작성되는 구문에 사용되었기 때문입니다. 이전 구문은 이전 버전과의 호환성을 위해 계속 지원됩니다. 이것은 당신이 원하는 것과 같지 않지만 어느 것과 except RuntimeError, TypeError같지 않다는 것을 의미합니다.except (RuntimeError, TypeError):except RuntimeError as TypeError:

 

반응형