programing

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

kingscode 2022. 10. 30. 20:43
반응형

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

예외를 처리하지 않고 시도만 하고 싶을 때 Python에서는 어떻게 하나요?

다음 방법이 올바른 방법인가요?

try:
    shutil.rmtree(path)
except:
    pass
try:
    doSomething()
except Exception: 
    pass

또는

try:
    doSomething()
except: 
    pass

은 두 수 입니다.KeyboardInterrupt,SystemExit은요, '에서 유래된 것입니다.BaseException 아니라, 이에요.Exception.

상세한 것에 대하여는, 다음의 메뉴얼을 참조해 주세요.

그러나 모든 오류를 잡는 것은 일반적으로 잘못된 관행입니다. "except: pass"가 잘못된 프로그래밍 관행인 이유를 참조하십시오.

일반적으로 관심 있는 오류만 파악하는 것이 가장 좋은 방법으로 간주됩니다. 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: forcusing to Unicode: need string or buffer, int found"라는 오류가 나타납니다.이 오류는 디버깅이 어려울 수 있습니다.

모든 오류를 확실하게 무시하고 싶다면Exception으로 하는 except:, 다시한 번 말씀드릴게요.시시, ??

예외를 지정하지 않으면 다음을 포함한 모든 예외가 발생합니다.SystemExit를 '예외'sys.exit() 삭제:

>>> try:
...     sys.exit(1)
... except:
...     pass
... 
>>>

이것을, 올바르게 종료하는 다음의 것과 비교합니다.

>>> try:
...     sys.exit(1)
... except Exception:
...     pass
... 
shell:~$ 

더 나은 동작의 코드를 쓰고 싶을 경우 예외는 다양한 오류를 나타낼 수 있지만 위의 예에서는 무시하기만 하면 됩니다.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만 하고 싶을 때 Python에서는 어떻게 하나요?

'취급'이란 게 무슨 뜻인지에 따라 다르죠.

아무 조치도 취하지 않고 잡으려는 경우 게시한 코드가 작동합니다.

예외가 스택 위로 올라가는 것을 중지하지 않고 예외에 대해 조치를 취할 경우 다음과 같은 작업을 수행합니다.

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

먼저 잭 오코너의 답변을 인용하겠습니다.참조된 스레드가 닫혔기 때문에 여기에 씁니다.

"Python 3.4에는 이를 위한 새로운 방법이 있습니다.

from contextlib import suppress

with suppress(Exception):
    # your code

여기에 추가된 커밋을 나타냅니다.http://hg.python.org/cpython/rev/406b47c64480

여기 저자 레이먼드 헤팅어(Raymond Hettinger)가 이것과 다른 모든 종류의 Python의 핫성에 대해 말하고 있습니다.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:
    i_might_fail()
except (ValueError, TypeError) as ex:
    print('I failed with: ', ex)

...또는 절을 제외한 별도로서:

try:
    i_might_fail()
except ValueError:
    print('handling a ValueError...')
except TypeError:
    print('handling a TypeError...')

...python 튜토리얼을 참조하십시오.

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

여기에는 여러 가지 방법이 있습니다.

그러나 예시의 선택은 일반적인 경우를 다루지 않는 단순한 해결책을 가지고 있다.

이 예에 고유:

대신

try:
    shutil.rmtree(path)
except:
    pass

다음을 수행합니다.

shutil.rmtree(path, ignore_errors=True)

이것은 에 고유한 의론이다.shutil.rmtree다음의 조작으로 헬프를 확인할 수 있습니다.또, 에러에 대해서도 기능할 수 있습니다.

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

이것은 예시의 좁은 케이스만을 대상으로 하고 있기 때문에, 이러한 키워드 인수가 존재하지 않는 경우의 대처 방법에 대해 한층 더 설명하겠습니다.

일반적인 접근법

위의 내용은 이 예의 좁은 케이스만을 대상으로 하고 있기 때문에, 이러한 키워드 인수가 존재하지 않는 경우의 대처 방법을 한층 더 설명하겠습니다.

Python 3.4의 새로운 기능:

Import는 할 수 .suppress★★★★★★★★★★★★★★★★★★★:

from contextlib import suppress

단, 가장 구체적인 예외만 억제합니다.

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

FileNotFoundError:

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

문서에서:

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

:suppress ★★★★★★★★★★★★★★★★★」FileNotFoundError파이썬 3의 약칭.

Python 2에서도 코드가 동작하도록 하려면 , 다음의 항을 참조해 주세요.

Python 2 & 3 :

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

다음 방법이 올바른 방법인가요?

try :
    shutil.rmtree ( path )
except :
    pass

2 코드인 Python 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 
try:
      doSomething()
except Exception: 
    pass
else:
      stuffDoneIf()
      TryClauseSucceeds()

참고로 other 절은 모든 예외 뒤에 올 수 있으며 시행 중인 코드로 인해 예외가 발생하지 않는 경우에만 실행됩니다.

여러 명령의 오류를 무시해야 했고 결국 성공했어

import fuckit

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

helper()

예외를 처리하지 않고 try catch만 하고 싶을 때 Python에서는 어떻게 하나요?

이를 통해 예외를 인쇄하는 데 도움이 됩니다(예외를 처리하지 않고 캐치를 시도하여 예외를 인쇄합니다.

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

Python에서는 다른 언어와 유사한 예외를 처리합니다만, 예를 들어 다음과 같은 구문의 차이가 있습니다.

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

이것은 테스트 예외가 아니라 오브젝트 지향 프로그래밍을 원하는 경우 예외를 처리하는 또 다른 방법입니다.

class MyExceptionHandler:

    def __enter__(self):
        ... # Do whatever when "with" block is started
        return self

    def __exit__(self, exc_type, exc_value, tb):
        return True

그리고 나서 실제 코드로:

with MyExceptionHandler():
     ... # Code that may or may not raise an exception
     shutil.rmtree(path)

이게 어떻게 작동하나요?

  • __enter__에 들어갈 때 실행됩니다.with차단합니다.
  • __exit__를 종료할 때 실행됩니다.with블록
    • 이것은 반환될 것입니다.True가능한 예외를 잠재우기 위해 사용합니다.
    • 이것은 반환될 것입니다.None(또는 False로 간주되는 것) 잠재적인 예외를 침묵시키지 않도록 합니다.
    • 예외 유형, 실제 예외 및 해당 트레이스백은 (위치) 인수로 전달됩니다.이를 사용하여 수행할 작업을 결정할 수 있습니다.

마지막으로 try-except를 선택합니다.이것은 평소보다 추상화가 더 필요한 경우에 유용할 수 있습니다.

저는 보통 다음과 같이 합니다.

try:
    doSomething()
except:
    _ = ""

언급URL : https://stackoverflow.com/questions/730764/how-to-properly-ignore-exceptions

반응형