나는 내가 할 수 있다는 것을 안다.
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 절은 여러 예외를 괄호로 묶은 튜플로 명명 할 수 있습니다 (예 :
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
. 개인적으로 선호합니다 .
모범 사례
현재와 파이썬과 호환되는 방식으로이 작업을 수행하려면 Exception을 쉼표로 분리하고 괄호로 묶어 예외 인스턴스를 변수 이름으로 할당 한 이전 구문과 구별하기 위해 Exception 유형을 따라야합니다. 반점.
간단한 사용법의 예는 다음과 같습니다.
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
라인은 단일 라인에서 처리 할 수 있습니다 파이썬 3.4에서 사용할 억제 컨텍스트 매니저 :
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
따라서 pass
특정 예외 를 원하면을 사용하십시오 suppress
.
답변
에서 파이썬 문서 -> 8.3 예외 처리 :
try
문은 다른 예외 핸들러를 지정하는 데 더 많은 조항을 제외하고 하나보다 수 있습니다. 최대 하나의 핸들러가 실행됩니다. 핸들러는 동일한 try 문의 다른 핸들러가 아니라 해당 try 절에서 발생하는 예외 만 처리합니다. except 절은 여러 예외의 이름을 괄호로 묶은 튜플로 지정할 수 있습니다. 예를 들면 다음과 같습니다.except (RuntimeError, TypeError, NameError): pass
이 튜플 주위의 괄호는 필수 입니다. 현대 파이썬에서
ValueError, e:
일반적으로 쓰여지는 구문except ValueError as e:
(아래 설명 참조)이 제외 되었기 때문 입니다. 이전 구문은 이전 버전과의 호환성을 위해 계속 지원됩니다. 이 수단은except RuntimeError, TypeError
같지 않습니다
except (RuntimeError, TypeError):
만에except RuntimeError as
TypeError:
있는 당신이 원하는 없습니다.
답변
많은 수의 예외를 자주 사용하는 경우 튜플을 미리 정의 할 수 있으므로 여러 번 다시 입력 할 필요가 없습니다.
#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
노트:
-
또한 사전 정의 된 튜플의 예외 이외의 다른 예외를 포착해야하는 경우 다른 except 블록을 정의해야합니다.
-
전역 변수를 허용 할 수 없다면 main ()에서 변수를 정의하고 필요한 곳으로 전달하십시오 …
답변
이 작업을 수행하는 방법 중 하나는
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]
나는 두 번째 방법이 이것을하는 가장 좋은 방법은 아니라는 것을 알고 있지만,이 일을하는 많은 방법을 보여주고 있습니다.