예외를 처리하지 않고 시험 제외를하고 싶을 때 파이썬에서 어떻게합니까?
다음이 올바른 방법입니까?
try:
shutil.rmtree(path)
except:
pass
예외를 처리하지 않고 시험 제외를하고 싶을 때 파이썬에서 어떻게합니까?
다음이 올바른 방법입니까?
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
A의 결과 NameError
) - 적어도 할에except OSError:
일반적으로 관심있는 오류 만 잡는 것이 가장 좋은 방법으로 간주됩니다.이 경우 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)
"유형 오류 : 유니 코드로 강제 변환 : 문자열 또는 버퍼 필요, int found" 오류가 발생 합니다.이를 무시하고 싶지 않을 수 있습니다. 디버그하기가 어려울 수 있습니다.
당신이 경우 확실히 모든 오류를 무시하려는 잡을 Exception
베어보다는 except:
문. 또 왜?
예외 캐치를 지정하지 않으면 모든 을 포함하여 예외를 SystemExit
제외하는 예에 대한 sys.exit()
사용 :
>>> try:
... sys.exit(1)
... except:
... pass
...
>>>
이것을 다음과 비교하면 올바르게 종료됩니다.
>>> try:
... sys.exit(1)
... except Exception:
... pass
...
shell:~$
더 나은 동작 코드를 작성하려면 OSError
예외가 다양한 오류를 나타낼 수 있지만 위의 예 Errno 2
에서는 무시 만하려고 하므로 더 구체적 일 수 있습니다.
import errno
try:
shutil.rmtree(path)
except OSError as e:
if e.errno != errno.ENOENT:
# ignore "No such file or directory", but re-raise other errors
raise
shutil.rmtree
ignore_errors=True
해당 기능에 사용 하기 때문에 최상의 예는 아닙니다 ..
먼저이 스레드 에서 Jack o'Connor의 답변을 인용하십시오 . 참조 된 스레드가 닫혀서 여기에 씁니다.
"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
이것에 대한 추가는 Python 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 err:
... print("Handling run-time error:", err)
... 다음과 같이 예외를 다시 발생시킵니다.
>>> try:
... raise NameError('HiThere')
... except NameError:
... print('An exception flew by!')
... raise
... 파이썬 튜토리얼의 예제 .
예외를 올바르게 무시하는 방법?
이를 수행하는 몇 가지 방법이 있습니다.
그러나 예제를 선택하면 일반적인 경우를 다루지 않는 간단한 솔루션이 있습니다.
대신에
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
파이썬 3에서만 사용할 수 있습니다.
Python 2에서도 코드를 작동 시키려면 다음 섹션을 참조하십시오.
예외를 처리하지 않고 시도 / 제외를하고 싶을 때 파이썬에서 어떻게합니까?
다음이 올바른 방법입니까?
try : shutil.rmtree ( path ) except : pass
Python 2 호환 코드 pass
의 경우 no-op 인 명령문을 갖는 올바른 방법입니다. 당신이 노출을 할 때 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를 원할 때 파이썬에서 어떻게 처리합니까?
이는 예외가 무엇인지 인쇄하는 데 도움이됩니다.
import sys
try:
doSomething()
except:
print "Unexpected error:", sys.exc_info()[0]
try:
doSomething()
except Exception:
pass
else:
stuffDoneIf()
TryClauseSucceeds()
참고로 else 절은 모든 예외 후에 갈 수 있으며 try의 코드가 예외를 유발하지 않는 경우에만 실행됩니다.
else
이 맥락에서 마지막으로 좋은 설명입니다 . 그리고 그것을 추가하려면 항상 예외가 발생하지 않고 실행 finally
됩니다 .
파이썬에서는 다른 언어와 비슷한 예외를 처리하지만 그 차이는 예를 들어 구문 차이입니다.
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...
shutil.rmtree(path, ignore_errors=True)
. 그러나 대부분의 기능에는 적용되지 않습니다.