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


776

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

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

try:
    shutil.rmtree(path)
except:
    pass

10
지금까지 아무도 언급하지 않았지만 (내 대답에서 했음)이 특정 기능에 대해서는 할 수 있습니다 shutil.rmtree(path, ignore_errors=True). 그러나 대부분의 기능에는 적용되지 않습니다.
Aaron Hall

9
예외를 무시할 때 고려해야 할 중요한 사항 : “제외 : 통과”가 나쁜 프로그래밍 관행 인 이유는 무엇입니까?
찌를

3
실제 생활에서 이것을하고 있다고 상상해보십시오. try : get_cash ( '$ 1000') 예외 : pass # meh, 아마 괜찮을 것입니다
Grokodile

답변:


1039
try:
    doSomething()
except: 
    pass

또는

try:
    doSomething()
except Exception: 
    pass

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

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


4
StopIteration과 Warning은 모두 Exception에서 상속됩니다. 필요에 따라 대신 StandardError에서 상속 할 수 있습니다.
Ben Blank

1
이것은 사실이지만 조심하지 않으면 미묘한 버그가 발생할 수 있습니다 (특히 StopIteration을 전달하는 것 이외의 일을하는 경우).
Jason Baker

17
-1, try: shuti.rmtree(...) except: pass(당신이 잘못 입력해도 조잡 오류가 표시되지 않습니다 shutilA의 결과 NameError) - 적어도 할에except OSError:
DBR

44
이 답변에는 유익한 정보가 있지만 중요한 정보가 없습니다. 이런 식으로 예외를 잡아서는 안됩니다. 대신, 항상 관심있는 예외 만 잡으려고 노력해야합니다. 그렇지 않으면 일반적인 "제외"에 의해 숨겨지는 사소한 버그를 사냥 할 때 악몽이 생길 것입니다. 자세한 내용은 dbr의 답변을 참조하십시오. (이것은 원래의 질문이 아니라는 것을 알고 있습니다-그러나 이것을 찾는 사람은 단지 당신의 발췌 문장을 그대로 사용합니다)
johndodo

139

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

1
shutil.rmtreeignore_errors=True해당 기능에 사용 하기 때문에 최상의 예는 아닙니다 ..
wim

113

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

"처리"의 의미에 따라 다릅니다.

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

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

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

88

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

55

완전성을 위해 :

>>> 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

... 파이썬 튜토리얼의 예제 .


43

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

이를 수행하는 몇 가지 방법이 있습니다.

그러나 예제를 선택하면 일반적인 경우를 다루지 않는 간단한 솔루션이 있습니다.

예제에만 해당 :

대신에

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 

11

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

이는 예외가 무엇인지 인쇄하는 데 도움이됩니다.

import sys
try:
    doSomething()
except:
    print "Unexpected error:", sys.exc_info()[0]

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

참고로 else 절은 모든 예외 후에 갈 수 있으며 try의 코드가 예외를 유발하지 않는 경우에만 실행됩니다.


1
else이 맥락에서 마지막으로 좋은 설명입니다 . 그리고 그것을 추가하려면 항상 예외가 발생하지 않고 실행 finally됩니다 .
not2qubit

5

나는 여러 명령에서 오류를 무시하고 fuckit 트릭을했다

import fuckit

@fuckit
def helper():
    print('before')
    1/0
    print('after1')
    1/0
    print('after2')

helper()

+1이 소스 코드 안에서 라이브 스택 수정과 같은 매우 유용한 것들을 배울 수 있기 때문에 확실히 하루를
보냈기

3

파이썬에서는 다른 언어와 비슷한 예외를 처리하지만 그 차이는 예를 들어 구문 차이입니다.

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...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.