예외를 올바르게 무시하는 방법
예외를 처리하지 않고 시도만 하고 싶을 때 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...')
예외를 올바르게 무시하는 방법
여기에는 여러 가지 방법이 있습니다.
그러나 예시의 선택은 일반적인 경우를 다루지 않는 단순한 해결책을 가지고 있다.
이 예에 고유:
대신
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
'programing' 카테고리의 다른 글
--secure-file-priv 인수를 정규화하지 못했습니다. (0) | 2022.11.08 |
---|---|
키=>값 배열을 JavaScript에 저장하는 가장 좋은 방법? (0) | 2022.10.30 |
Java에서의 ClassCast Exception 설명 (0) | 2022.10.30 |
Python에서 클래스 변수를 정의하는 올바른 방법 (0) | 2022.10.30 |
python의 반복기에서 has_next가 있습니까? (0) | 2022.10.30 |