etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 11. 5. 23:09
반응형

질문자 :inspectorG4dget


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

 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 .


mechanical_meat

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

이 작업을 수행:

 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 , except , pass 라인은 Python 3.4에서 사용할 수 있는 억제 컨텍스트 관리자를 사용하여 한 줄에서 처리할 수 있습니다.

 from contextlib import suppress with suppress(IDontLikeYouException, YouAreBeingMeanException): do_something()

따라서 특정 예외 pass suppress 사용하십시오.


Aaron Hall

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

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

 except (RuntimeError, TypeError, NameError): pass

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


fedorqui 'SO stop harming'

많은 수의 예외를 자주 사용하는 경우 튜플을 미리 정의할 수 있으므로 여러 번 다시 입력할 필요가 없습니다.

 #This example code is a technique I use in a library that connects with websites to gather data ConnectErrs = (URLError, SSLError, SocketTimeoutError, BadStatusLine, ConnectionResetError) def connect(url, data): #do connection and return some data return(received_data) def some_function(var_a, var_b, ...): try: o = connect(url, data) except ConnectErrs as e: #do the recovery stuff blah #do normal stuff you would do if no exception occurred

노트:

  1. 또한 미리 정의된 튜플에 있는 예외가 아닌 다른 예외도 잡아야 하는 경우 다른 예외 블록을 정의해야 합니다.

  2. 전역 변수를 허용할 수 없다면 main()에서 정의하고 필요한 곳에 전달하십시오...


whitebeard

그 방법 중 하나는..

 try: You do your operations here; ...................... except(Exception1[, Exception2[,...ExceptionN]]]): If there is any exception from the given exception list, then execute this block. ...................... else: If there is no exception then execute this block.

except 블록이 수행하는 작업을 수행하는 메소드를 생성하고 작성한 except 블록을 통해 호출하는 것입니다.

 try: You do your operations here; ...................... except Exception1: functionname(parameterList) except Exception2: functionname(parameterList) except Exception3: functionname(parameterList) else: If there is no exception then execute this block. def functionname( parameters ): //your task.. return [expression]

나는 두 번째 방법이 이것을 하는 최선의 방법이 아니라는 것을 알고 있지만, 나는 단지 이 일을 하는 많은 방법을 보여주고 있을 뿐입니다.


M.Usman

출처 : http:www.stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block

반응형