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

예외를 처리하지 않고 시험 제외를하고 싶을 때 파이썬에서 어떻게합니까?

다음이 올바른 방법입니까?

try:
    shutil.rmtree(path)
except:
    pass



답변

try:
    doSomething()
except: 
    pass

또는

try:
    doSomething()
except Exception: 
    pass

차이점은 첫 번째 것 또한 잡을 것이고 KeyboardInterrupt, SystemExit그것으로부터 직접 파생되는 것들도 exceptions.BaseException아닙니다 exceptions.Exception.

자세한 내용은 설명서를 참조하십시오.


답변

일반적으로 관심있는 오류 만 잡는 것이 가장 좋은 방법으로 간주됩니다.이 경우 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


답변

예외를 처리하지 않고 try catch를 원할 때 파이썬에서 어떻게 처리합니까?

“처리”의 의미에 따라 다릅니다.

아무런 조치를 취하지 않고 잡으려고하면 게시 한 코드가 작동합니다.

예외가 스택으로 올라가지 않도록 예외없이 조치를 수행하려는 경우 다음과 같은 것을 원합니다.

try:
    do_something()
except:
    handle_exception()
    raise  #re-raise the exact same exception that was thrown


답변

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

이것은 예제의 좁은 경우에만 적용되므로 키워드 인수가 존재하지 않는 경우이를 처리하는 방법을 추가로 설명합니다.

일반적인 접근

위의 예제는 좁은 경우에만 해당되므로 키워드 인수가 존재하지 않는 경우이를 처리하는 방법을 추가로 설명합니다.

Python 3.4의 새로운 기능 :

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

from contextlib import suppress

그러나 가장 구체적인 예외 만 억제하십시오.

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

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

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

로부터 문서 :

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

점에 유의 suppress하고 FileNotFoundError파이썬 3에서만 사용할 수 있습니다.

Python 2에서도 코드를 작동 시키려면 다음 섹션을 참조하십시오.

파이썬 2 & 3 :

예외를 처리하지 않고 시도 / 제외를하고 싶을 때 파이썬에서 어떻게합니까?

다음이 올바른 방법입니까?

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]