예외를 처리하지 않고 try-except를하고 싶을 때, 어떻게 파이썬에서 그것을합니까?
다음과 같이 올바른 방법이 있습니까?
try:
shutil.rmtree(path)
except:
pass
try:
doSomething()
except:
pass
또는
try:
doSomething()
except Exception:
pass
차이점은 첫 번째 것 또한 잡을 것입니다.KeyboardInterrupt
,SystemExit
그런 것들은 직접적으로 파생됩니다.exceptions.BaseException
, 아니라exceptions.Exception
.
자세한 내용은 설명서를 참조하십시오.
try: shuti.rmtree(...) except: pass
실수로 모든 오류를 억제합니다 (철자가 틀린 경우에도).shutil
그 결과NameError
) - 적어도 doexcept OSError:
- dbr
일반적으로 관심있는 오류 만 잡는 것이 가장 좋습니다.shutil.rmtree
아마도OSError
:
>>> shutil.rmtree("/fake/dir")
Traceback (most recent call last):
[...]
OSError: [Errno 2] No such file or directory: '/fake/dir'
자동으로 오류를 무시하려면 다음을 수행하십시오.
try:
shutil.rmtree(path)
except OSError:
pass
왜? 다음과 같이 실수로 함수를 문자열 대신 정수로 전달한다고 가정 해보십시오.
shutil.rmtree(2)
그것은 오류를 줄 것이다"TypeError : 유니 코드로 강제 변환 : 문자열 또는 버퍼가 필요합니다. int가 발견되었습니다."- 아마도 디버깅하기 어려울 수있는 것을 무시하고 싶지 않을 것입니다.
만약 너라면명확히모든 오류를 무시하고 싶다.Exception
맨손으로보다는 오히려except:
성명서. 다시, 왜?
예외를 지정하지 않으면 catch됩니다....마다예외를 포함하여SystemExit
예를 들어 예외sys.exit()
용도 :
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
이것을 정확히 끝내는 다음과 비교하십시오 :
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
보다 나은 동작 코드를 작성하려면OSError
예외는 다양한 오류를 나타낼 수 있지만 위의 예에서는 무시하고 싶을뿐입니다.Errno 2
, 그래서 우리는 더 구체적 일 수 있습니다 :
try:
shutil.rmtree(path)
except OSError, e:
if e.errno == 2:
# suppress "No such file or directory" error
pass
else:
# reraise the exception, as it's an unexpected error
raise
너는 또한 할 수 있었다.import errno
그리고if
에if e.errno == errno.ENOENT:
예외를 처리하지 않고 try catch를 수행하려는 경우 Python에서 어떻게 처리합니까?
그것은 "처리"의 의미에 달려 있습니다.
어떤 조치도 취하지 않고 그것을 잡으려고한다면 게시 한 코드가 작동합니다.
스택에 올라가는 예외를 멈추지 않고 예외에 대한 조치를 취하고 싶다면 다음과 같은 것이 필요합니다.
try:
do_something()
except:
handle_exception()
raise #re-raise the exact same exception that was thrown
먼저 잭 오코너의 대답을 인용합니다.이 실. 참조 된 스레드가 닫혀 있으므로 여기에 글을 씁니다.
"Python 3.4에서이 작업을 수행 할 수있는 새로운 방법이 있습니다.
from contextlib import suppress
with suppress(Exception):
# your code
추가 한 커밋은 다음과 같습니다.http://hg.python.org/cpython/rev/406b47c64480
그리고 저자 인 Raymond Hettinger는 이것과 모든 종류의 파이썬에 대해 이야기합니다.https://youtu.be/OSGv2VnC0go?t=43m23s
이뿐 만 아니라 파이썬 2.7에 해당한다.
from contextlib import contextmanager
@contextmanager
def ignored(*exceptions):
try:
yield
except exceptions:
pass
그런 다음 Python 3.4에서와 같이 사용합니다.
with ignored(Exception):
# your code
완성을 위해 :
>>> def divide(x, y):
... try:
... result = x / y
... except ZeroDivisionError:
... print "division by zero!"
... else:
... print "result is", result
... finally:
... print "executing finally clause"
...로부터파이썬 튜토리얼.
또한 다음과 같이 예외를 포착 할 수 있습니다.
>>> try:
... this_fails()
... except ZeroDivisionError as detail:
... print 'Handling run-time error:', detail
예외를 올바르게 무시하는 방법?
이 작업에는 몇 가지 방법이 있습니다.
그러나 예제 선택은 일반적인 경우를 다루지 않는 간단한 솔루션을 제공합니다.
대신에
try:
shutil.rmtree(path)
except:
pass
이 작업을 수행:
shutil.rmtree(path, ignore_errors=True)
이것은 다음과 같은 특정 인수입니다.shutil.rmtree
. 다음을 수행하여 도움말을 볼 수 있으며, 오류에 대한 기능도 허용 할 수 있습니다.
>>> import shutil
>>> help(shutil.rmtree)
여기서는 예제의 좁은 경우 만 다루기 때문에 키워드 인수가 없으면이를 처리하는 방법을 더 보여줄 것입니다.
위 예제는 예제의 좁은 케이스만을 다루기 때문에, 키워드 인수가 존재하지 않는다면이를 처리하는 방법을 더 보여줄 것입니다.
다음을 가져올 수 있습니다.suppress
컨텍스트 관리자 :
from contextlib import suppress
그러나 가장 구체적인 예외 만 억제합니다.
with suppress(FileNotFoundError):
shutil.rmtree(path)
당신은 조용히 무시할 것입니다.FileNotFoundError
:
>>> with suppress(FileNotFoundError):
... shutil.rmtree('bajkjbkdlsjfljsf')
...
>>>
로부터워드 프로세서:
예외를 완전히 억제하는 다른 메커니즘과 마찬가지로, 이 컨텍스트 관리자는 매우 특정한 오류를 다루는 용도로만 사용해야합니다. 프로그램 실행을 조용히 계속하는 것이 옳은 일.
유의 사항suppress
과FileNotFoundError
Python 3에서만 사용할 수 있습니다.
Python 2에서 코드가 작동하도록하려면 다음 절을 참조하십시오.
예외를 처리하지 않고 try / except를하고 싶을 때, 파이썬에서 어떻게합니까?
다음과 같이 올바른 방법이 있습니까?
try : shutil.rmtree ( path ) except : pass
파이썬 2 호환 코드의 경우,pass
아무 말도하지 않는 진술을하는 올바른 방법입니다. 하지만 니가 할 때except:
, 그것은 일을하는 것과 같습니다.except BaseException:
포함하는GeneratorExit
,KeyboardInterrupt
, 및SystemExit
, 그리고 일반적으로, 당신은 그 것을 붙잡고 싶지 않습니다.
사실, 가능한 한 예외를 명명하는 데있어 구체적이어야합니다.
다음은 Python (2)의 일부입니다.예외 계층 구조보시다시피보다 일반적인 예외를 발견하면 예상치 못한 문제를 숨길 수 있습니다.
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StandardError
| +-- BufferError
| +-- ArithmeticError
| | +-- FloatingPointError
| | +-- OverflowError
| | +-- ZeroDivisionError
| +-- AssertionError
| +-- AttributeError
| +-- EnvironmentError
| | +-- IOError
| | +-- OSError
| | +-- WindowsError (Windows)
| | +-- VMSError (VMS)
| +-- EOFError
... and so on
아마도 여기에 OSError를 잡기를 원할 것입니다. 디렉토리가 없다면 걱정하지 않아도 될 것입니다.
우리는 얻을 수있다.그특정 오류 번호errno
도서관, 그리고 그것이없는 경우에는
import errno
try:
shutil.rmtree(path)
except OSError as error:
if error.errno == errno.ENOENT: # no such file or directory
pass
else: # we had an OSError we didn't expect, so reraise it
raise
참고로, 맨손으로 인상하면 원래의 예외가 발생합니다. 원래의 예외는이 경우 원하는 것일 수 있습니다. 우리가 실제로 명시 적으로 할 필요가 없으므로 더 간결하게 작성되었습니다.pass
예외 처리에서 코드 사용 :
try:
shutil.rmtree(path)
except OSError as error:
if error.errno != errno.ENOENT: # no such file or directory
raise
예외를 처리하지 않고 try catch를 수행하려는 경우 Python에서 어떻게 처리합니까?
이렇게하면 예외가 인쇄되는 데 도움이됩니다. 즉 예외를 처리하지 않고 catch를 시도하고 예외를 인쇄합니다.
import sys .... try: doSomething() except: print "Unexpected error:", sys.exc_info()[0] ...
reg, Tilokchan
try:
doSomething()
except Exception:
pass
else:
stuffDoneIf()
TryClauseSucceeds()
참고 else 절은 모든 예외 뒤에 올 수 있으며 try의 코드에서 예외가 발생하지 않는 경우에만 실행됩니다.
else
이 문맥에서. 그리고 그것을 추가하려면finally
의지항상아무런 예외없이 실행됩니다. - not2qubit
파이썬에서는 다른 언어와 비슷한 예외를 처리하지만 차이점은 구문상의 차이입니다. 예를 들어,
try:
#Your code in which exception can occur
except <here we can put in a particular exception name>:
# We can call that exception here also, like ZeroDivisionError()
# now your code
# We can put in a finally block also
finally:
# Your code...
여러 명령에서 오류를 무시하고망할트릭을 했어.
import fuckit
@fuckit
def helper():
print('before')
1/0
print('after1')
1/0
print('after2')
helper()
간단히증가관련 예외는 다음과 같습니다.
try:
raise NameError('Joan')
except NameError:
print 'An exception just raised again by Joan!'
raise
저것과 같이 쉬운. :)
자세한 내용은이 설명서를 읽으십시오. https://docs.python.org/3.6/tutorial/errors.html
John
대신에raise NameError('Joan')
(ifJohn
정의되지 않음) - U9-Forward
파이썬에서 예외 처리하기 :예외를 발생시킬 수있는 의심스러운 코드가있는 경우 try : 블록에 의심스러운 코드를 넣어 프로그램을 방어 할 수 있습니다.
try:
# Your statements .............
except ExceptionI:
# Your statements.............
except ExceptionII:
# Your statements..............
else:
# Your statements
shutil.rmtree(path, ignore_errors=True)
. 그러나이 기능은 대부분의 기능에 적용되지 않습니다. - Aaron Hall♦