[Python] 예외를 올바르게 무시하는 방법?


Answers

관심있는 오류 만 잡는 것이 일반적으로 최선의 방법으로 간주됩니다. 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 : 유니 코드로 강제 변환 : 문자열 또는 버퍼가 필요합니다." 라는 오류가 발생합니다. 디버깅하기 어려울 수 있으므로이를 무시하고 싶지는 않을 것입니다.

확실하게 모든 오류를 무시하려면 Exception except: 문보다는 Exception 잡으십시오. 다시, 왜?

예외를 지정하지 않으면 sys.exit() 사용하는 SystemExit 예외를 비롯하여 모든 예외가 발생합니다.

>>> 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 errnoimport errno 하고 ifif e.errno == errno.ENOENT: 변경 if e.errno == errno.ENOENT:

Question

예외를 처리하지 않고 try-except를하고 싶을 때, 어떻게 파이썬에서 그것을합니까?

다음과 같이 올바른 방법이 있습니까?

try:
    shutil.rmtree(path)
except:
    pass



먼저이 스레드 에서 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

이뿐 만 아니라 파이썬 2.7에 해당한다.

from contextlib import contextmanager

@contextmanager
def ignored(*exceptions):
    try:
        yield
    except exceptions:
        pass

그런 다음 Python 3.4에서와 같이 사용합니다.

with ignored(Exception):
    # your code



try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

참고 else 절은 모든 예외 뒤에 올 수 있으며 try의 코드에서 예외가 발생하지 않는 경우에만 실행됩니다.




예외를 올바르게 무시하는 방법?

이 작업에는 몇 가지 방법이 있습니다.

그러나 예제 선택은 일반적인 경우를 다루지 않는 간단한 솔루션을 제공합니다.

예제에만 해당 :

대신에

try:
    shutil.rmtree(path)
except:
    pass

이 작업을 수행:

shutil.rmtree(path, ignore_errors=True)

이것은 shutil.rmtree 고유 한 인수입니다. 다음을 수행하여 도움말을 볼 수 있으며, 오류에 대한 기능도 허용 할 수 있음을 알 수 있습니다.

>>> import shutil
>>> help(shutil.rmtree)

여기서는 예제의 좁은 경우 만 다루기 때문에 키워드 인수가 없으면이를 처리하는 방법을 더 보여줄 것입니다.

일반적인 접근

위 예제는 예제의 좁은 케이스만을 다루기 때문에, 키워드 인수가 존재하지 않는다면이를 처리하는 방법을 더 보여줄 것입니다.

파이썬 3.4의 새로운 기능 :

suppress 컨텍스트 관리자를 가져올 수 있습니다.

from contextlib import suppress

그러나 가장 구체적인 예외 만 억제합니다.

with suppress(FileNotFoundError):
    shutil.rmtree(path)

당신은 조용히 FileNotFoundError 무시할 것입니다 :

>>> with suppress(FileNotFoundError):
...     shutil.rmtree('bajkjbkdlsjfljsf')
... 
>>> 

docs :

예외를 완전히 억제하는 다른 메커니즘과 마찬가지로이 컨텍스트 관리자는 프로그램 실행을 자동으로 계속하는 것이 올바른 일임을 알리는 매우 구체적인 오류를 다루는 용도로만 사용해야합니다.

suppressFileNotFoundError 는 Python 3에서만 사용할 수 있습니다.

Python 2에서 코드가 작동하게하려면 다음 절을 참조하십시오.

파이썬 2 및 3 :

예외를 처리하지 않고 try / except를하고 싶을 때, 어떻게 파이썬에서 그것을합니까?

다음과 같이 올바른 방법이 있습니까?

try :
    shutil.rmtree ( path )
except :
    pass

Python 2 호환 코드의 경우, no-op 문을 사용하는 올바른 방법은 pass 입니다. 그러나 당신이 다음을 except: GeneratorExit , KeyboardInterruptSystemExit 를 포함하는 except BaseException: 수행하는 것과 동일하며, 일반적으로 이러한 것들을 포착하고 싶지는 않습니다.

사실, 가능한 한 예외를 명명하는 데있어 구체적이어야합니다.

다음은 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 : 블록에 의심스러운 코드를 넣어 프로그램을 보호 할 수 있습니다.

try:
    # your statements .............
except ExceptionI:
    # your statments.............
except ExceptionII:
    # your statments..............
else:
   # your statments