635

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

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

try:
    shutil.rmtree(path)
except:
    pass


  • 이상한 말은 지금까지는 아무도 언급하지 않았다. (필자가 대답했다.) 그러나이 특정 기능을 위해서, 당신은 할 수있다.shutil.rmtree(path, ignore_errors=True). 그러나이 기능은 대부분의 기능에 적용되지 않습니다. - Aaron Hall
  • 예외를 무시할 때 고려해야 할 중요 사항 :왜 "예외 : 통과"나쁜 프로그래밍 관행? - poke
  • 실생활에서 이것을하는 것을 상상해보십시오. 시도하십시오 : get_cash (Ϩ ' 제외) : #meh를 전달하면 괜찮을 것입니다. - Grokodile

12 답변


886

try:
  doSomething()
except: 
  pass

또는

try:
  doSomething()
except Exception: 
  pass

차이점은 첫 번째 것 또한 잡을 것입니다.KeyboardInterrupt,SystemExit그런 것들은 직접적으로 파생됩니다.exceptions.BaseException, 아니라exceptions.Exception.

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


  • StopIteration과 Warning 모두 Exception에서 상속받습니다. 필요에 따라 StandardError를 상속 할 수 있습니다. - Ben Blank
  • @ 벤 : 둘 다 "정상적인" 예외, 그래서 아무 문제가 .. - vartec
  • 물론 사실이지만 신중하지 않으면 미묘한 버그가 발생할 수 있습니다 (특히 StopIteration을 전달하는 것 이외의 다른 작업을 수행하는 경우). - Jason Baker
  • -1,try: shuti.rmtree(...) except: pass실수로 모든 오류를 억제합니다 (철자가 틀린 경우에도).shutil그 결과NameError) - 적어도 doexcept OSError: - dbr
  • 이 답변은 유익한 정보이지만 중요한 정보가 누락되어 있습니다. 이런 식으로 예외를 잡아서는 안됩니다. 대신 항상 관심있는 예외 만 잡으려고 노력해야합니다. 그렇지 않으면 일반적인 "예외"로 숨겨져있는 사소한 버그를 찾아 낼 때 악몽을 꾸게됩니다. 자세한 정보는 dbr의 답변을보십시오. (나는 이것이 원래의 질문이 아니라는 것을 안다 - 그러나 이것을 찾는 누군가는 당신의 스 니펫을 취하여 그대로 사용한다) - johndodo

121

일반적으로 관심있는 오류 만 잡는 것이 가장 좋습니다.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그리고ifif e.errno == errno.ENOENT:


108

예외를 처리하지 않고 try catch를 수행하려는 경우 Python에서 어떻게 처리합니까?

그것은 "처리"의 의미에 달려 있습니다.

어떤 조치도 취하지 않고 그것을 잡으려고한다면 게시 한 코드가 작동합니다.

스택에 올라가는 예외를 멈추지 않고 예외에 대한 조치를 취하고 싶다면 다음과 같은 것이 필요합니다.

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


70

먼저 잭 오코너의 대답을 인용합니다.이 실. 참조 된 스레드가 닫혀 있으므로 여기에 글을 씁니다.

"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


54

완성을 위해 :

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


40

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

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

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

예제에만 해당 :

대신에

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

로부터워드 프로세서:

예외를 완전히 억제하는 다른 메커니즘과 마찬가지로,   이 컨텍스트 관리자는 매우 특정한 오류를 다루는 용도로만 사용해야합니다.   프로그램 실행을 조용히 계속하는 것이   옳은 일.

유의 사항suppressFileNotFoundErrorPython 3에서만 사용할 수 있습니다.

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

Python 2 & amp; 삼:

예외를 처리하지 않고 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 


12

예외를 처리하지 않고 try catch를 수행하려는 경우 Python에서 어떻게 처리합니까?

이렇게하면 예외가 인쇄되는 데 도움이됩니다. 즉 예외를 처리하지 않고 catch를 시도하고 예외를 인쇄합니다.

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

...

reg, Tilokchan


9

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

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


  • 마침내 좋은 설명else이 문맥에서. 그리고 그것을 추가하려면finally의지항상아무런 예외없이 실행됩니다. - not2qubit

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


0

여러 명령에서 오류를 무시하고망할트릭을 했어.

import fuckit

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

helper()


-1

간단히증가관련 예외는 다음과 같습니다.

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

-1

파이썬에서 예외 처리하기 :예외를 발생시킬 수있는 의심스러운 코드가있는 경우 try : 블록에 의심스러운 코드를 넣어 프로그램을 방어 할 수 있습니다.

try:
    # Your statements .............
except ExceptionI:
    # Your statements.............
except ExceptionII:
    # Your statements..............
else:
   # Your statements

연결된 질문


관련된 질문

최근 질문