Python에서 수동으로 예외 발생(던지기)
에 Python을 수 있도록 Python에서 요?except 차단? 차단?
Python에서 예외를 수동으로 던지거나 발생시키는 방법은 무엇입니까?
의미론적으로 문제에 맞는 가장 구체적인 예외 생성자를 사용하십시오.
메시지에 구체적으로 기입해 주세요.예를 들어 다음과 같습니다.
raise ValueError('A very specific bad thing happened.')
일반 예외 발생 안 함
인 「」의 .Exception하위 하는 다른 이를 포착하려면 하위 분류에 해당하는 다른 모든 특정 예외를 포착해야 합니다.
문제 1: 버그 숨기기
raise Exception('I know Python!') # Don't! If you catch, likely to hide bugs.
예를 들어 다음과 같습니다.
def demo_bad_catch():
try:
raise ValueError('Represents a hidden bug, do not catch this')
raise Exception('This is the exception you expect to handle')
except Exception as error:
print('Caught this error: ' + repr(error))
>>> demo_bad_catch()
Caught this error: ValueError('Represents a hidden bug, do not catch this',)
문제 2: 잡히지 않음
그리고 보다 구체적인 어획량은 일반적인 예외에 해당하지 않습니다.
def demo_no_catch():
try:
raise Exception('general exceptions not caught by specific handling')
except ValueError as e:
print('we will not catch exception: Exception')
>>> demo_no_catch()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in demo_no_catch
Exception: general exceptions not caught by specific handling
프랙티스: " " " "raise의 표시
대신 의미상 문제에 맞는 가장 구체적인 예외 생성자를 사용하십시오.
raise ValueError('A very specific bad thing happened')
또한 임의의 수의 인수를 컨스트럭터에 쉽게 전달할 수 있습니다.
raise ValueError('A very specific bad thing happened', 'foo', 'bar', 'baz')
는, 「이러다」에 됩니다.args의 Exception를 들어 다음과 같습니다예를 들어 다음과 같습니다.
try:
some_code_that_may_raise_our_value_error()
except ValueError as err:
print(err.args)
인쇄하다
('message', 'foo', 'bar', 'baz')
2.에서는, Python 2.5의 「Python 2.5」, 「Python 2.5에서는, 「Python 2.5입니다.message되었습니다.BaseException합니다.args단, 및 args의 당초 도입은 철회되었습니다.
프랙티스: " " " "except 삭제
예를 들어 except 구 내에 있는 경우 특정 유형의 오류가 발생했음을 기록한 후 다시 시작할 수 있습니다.스택 트레이스를 유지하면서 이 작업을 수행하는 가장 좋은 방법은 bare raise 문을 사용하는 것입니다.예를 들어 다음과 같습니다.
logger = logging.getLogger(__name__)
try:
do_something_in_app_that_breaks_easily()
except AppError as error:
logger.error(error)
raise # just this!
# raise AppError # Don't do this, you'll lose the stack trace!
오류를 수정하지 마십시오.하지만 굳이 원하신다면.
는, 「」( 「」)로 할 수 .sys.exc_info()그러나 이것은 훨씬 더 오류가 발생하기 쉽고 Python 2와 3 사이에 호환성 문제가 있으므로 베어 사용을 선호합니다.raise시시시키키키키
하자면 - 설 - - to to to -sys.exc_info(),,, 값값값을을 을을을을을을을반반반
type, value, traceback = sys.exc_info()
다음은 Python 2의 구문입니다. Python 3과 호환되지 않습니다.
raise AppError, error, sys.exc_info()[2] # avoid this.
# Equivalently, as error *is* the second object:
raise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
에 따라서,인상에 , 인상의 할 수 .args예를 들어 다음과 같습니다.
def error():
raise ValueError('oops!')
def catch_error_modify_message():
try:
error()
except ValueError:
error_type, error_instance, traceback = sys.exc_info()
error_instance.args = (error_instance.args[0] + ' <modification>',)
raise error_type, error_instance, traceback
arg를 수정하는 동안 전체 트레이스백을 보존했습니다.이것은 베스트 프랙티스가 아니며 Python 3에서는 잘못된 구문입니다(호환성을 유지하는 것이 훨씬 더 어려워집니다).
>>> catch_error_modify_message()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in catch_error_modify_message
File "<stdin>", line 2, in error
ValueError: oops! <modification>
raise error.with_traceback(sys.exc_info()[2])
다시 말씀드리지만 트레이스백을 수동으로 조작하지 마십시오.효율성이 떨어지고 오류가 발생하기 쉽습니다.스레드를 사용하고 있다면sys.exc_info잘못된 트레이스 백을 얻을 수도 있습니다(특히 컨트롤 플로우에 예외 처리를 사용하고 있는 경우, 저는 개인적으로 그것을 피하는 경향이 있습니다).
Python 3, 예외 체인
Python 3에서는 예외 체인을 통해 트레이스백을 유지할 수 있습니다.
raise RuntimeError('specific message') from error
주의:
- 그러면 발생한 오류 유형을 변경할 수 있습니다.
- 이것은 Python 2와 호환되지 않습니다.
권장되지 않는 방법:
이들은 쉽게 숨길 수 있고 심지어 프로덕션 코드로 들어갈 수도 있습니다.예외를 발생시키고 싶다면 예외를 발생시키지만 의도한 것은 아닙니다!
Python 2에서는 유효하지만 Python 3에서는 유효하지 않습니다.
raise ValueError, 'message' # Don't do this, it's deprecated!
훨씬 이전 버전의 Python(2.4 이하)에서만 유효하지만, 여전히 사람들이 문자열을 올리는 것을 볼 수 있습니다.
raise 'message' # really really wrong. don't do this.
모든 현대 버전에서, 이것은 실제로 상승할 것입니다.TypeErrorBaseException를 입력합니다.적절한 예외를 체크하지 않고 문제를 인식하고 있는 리뷰어가 없는 경우 실제 가동 상태가 될 수 있습니다.
사용 예
API를 잘못 사용하고 있는 경우 소비자에게 경고하기 위해 예외를 제기합니다.
def api_func(foo):
'''foo should be either 'baz' or 'bar'. returns something very useful.'''
if foo not in _ALLOWED_ARGS:
raise ValueError('{foo} wrong, use "baz" or "bar"'.format(foo=repr(foo)))
apropos에서 독자적인 에러 타입을 작성한다.
"나는 일부러 실수를 하고 싶다. 그래야 그것이 다음 중 하나에 들어갈 수 있다."
응용 프로그램에 특정 문제가 있음을 나타내려면 예외 계층에서 적절한 지점을 하위 분류하면 됩니다.
class MyAppLookupError(LookupError):
'''raise this when there's a lookup error for my app'''
및 사용방법:
if important_key not in resource_dict and not ok_to_be_missing:
raise MyAppLookupError('resource is missing, and that is not ok.')
이보다 더 많은 피토닉은 없을 것이다.
raise Exception("I know Python!")
Exception특정 유형의 예외를 설정할 수 있습니다.
자세한 내용은 Python의 raise 스테이트먼트 문서를 참조하십시오.
Python 3에서는 예외를 발생시키기 위한 4가지 구문이 있습니다.
- 예외를 제기하다
- 예외를 두다
- 올리다
- original_discriptions에서 예외를 제기하다
1. 예외 발생 vs. 2. 예외 발생 (arg)
「 」를 사용하고 raise exception (args)로 하다args예외 개체를 인쇄할 때 아래 예시와 같이 인쇄됩니다.
# Raise exception (args)
try:
raise ValueError("I have raised an Exception")
except ValueError as exp:
print ("Error", exp) # Output -> Error I have raised an Exception
# Raise exception
try:
raise ValueError
except ValueError as exp:
print ("Error", exp) # Output -> Error
3. 성명서 작성
raise인수 없는 스테이트먼트는 마지막 예외를 재인식합니다.
이 기능은 예외를 포착한 후 몇 가지 작업을 수행해야 하고 다시 작성하려는 경우에 유용합니다.그 전에 그 예외는 ?raiseTypeError★★★★★★ 。
def somefunction():
print("some cleaning")
a=10
b=0
result=None
try:
result=a/b
print(result)
except Exception: # Output ->
somefunction() # Some cleaning
raise # Traceback (most recent call last):
# File "python", line 8, in <module>
# ZeroDivisionError: division by zero
4. original_exception에서 예외(args)를 발생시킨다.
이 문은 다른 예외에 대한 응답으로 발생하는 예외에 원래 예외의 세부 정보가 포함될 수 있는 예외 체인을 만들기 위해 사용됩니다(아래 예 참조).
class MyCustomException(Exception):
pass
a=10
b=0
reuslt=None
try:
try:
result=a/b
except ZeroDivisionError as exp:
print("ZeroDivisionError -- ",exp)
raise MyCustomException("Zero Division ") from exp
except MyCustomException as exp:
print("MyException",exp)
print(exp.__cause__)
출력:
ZeroDivisionError -- division by zero
MyException Zero Division
division by zero
치 않은, 그 수 하기 위해 : 은 " " "인 것 .가장 논리적인 것은 다음과 같습니다.AssertionError:
if 0 < distance <= RADIUS:
#Do something.
elif RADIUS < distance:
#Do something.
else:
raise AssertionError("Unexpected value of 'distance'!", distance)
먼저 기존의 답을 읽어보세요.이것은 부록에 불과합니다.
인수의 유무에 관계없이 예외를 발생시킬 수 있습니다.
예:
raise SystemExit
프로그램을 종료하지만 무슨 일이 일어났는지 알고 싶을 수도 있습니다.이걸 쓰시면 됩니다.
raise SystemExit("program exited")
그러면 프로그램을 닫기 전에 표준 오류로 "프로그램 종료됨"이 인쇄됩니다.
주의: 일반적인 예외를 처리해야 할 경우가 있습니다.많은 파일을 처리하고 오류를 기록하는 경우 파일에 대해 발생하는 오류를 모두 파악하여 기록하고 나머지 파일을 계속 처리해야 할 수 있습니다.이 경우,
try:
foo()
except Exception as e:
print(e) # Print out handled error
블록이 좋은 방법입니다. 하고 raise어떤 의미인지 알 수 있도록 구체적인 예외 사항도 있습니다.
하려면 , 「」를 합니다.BaseException예외 계층의 맨 위에 있습니다.
1. 예외를 포착하다
try:
# Do something
except BaseException as error:
print('An exception occurred: {}'.format(error))
2. 예외 발생
try:
# Do something
except BaseException as error:
raise 'An exception occurred: {}'.format(error)
위 코드는 최신 버전의 Python 2.7을 지원합니다.
레퍼런스:예외 계층
예외를 발생시키는 다른 방법은 를 사용하는 것입니다.아사트를 사용하여 조건이 충족되고 있는지 확인할 수 있습니다.그렇지 않으면 상승합니다.AssertionError자세한 내용은 여기를 참조하십시오.
def avg(marks):
assert len(marks) != 0, "List is empty."
return sum(marks)/len(marks)
mark2 = [55,88,78,90,79]
print("Average of mark2:", avg(mark2))
mark1 = []
print("Average of mark1:", avg(mark1))
사용자 지정 예외를 발생시킬 수도 있습니다.예를 들어 라이브러리를 작성하는 경우 모듈에 대한 기본 예외 클래스를 만든 후 보다 구체적으로 사용자 정의 하위 예외를 지정하는 것이 좋습니다.
다음과 같이 할 수 있습니다.
class MyModuleBaseClass(Exception):
pass
class MoreSpecificException(MyModuleBaseClass):
pass
# To raise custom exceptions, you can just
# use the raise keyword
raise MoreSpecificException
raise MoreSpecificException('message')
클래스가 없는, 커스텀 수.Exception,TypeError,ValueError 등등.
당신은 그것을 위해 Python의 raise 스테이트먼트를 배워야 합니다.
테스트 블록 안에 보관해야 합니다.
예 -
try:
raise TypeError # Replace TypeError by any other error if you want
except TypeError:
print('TypeError raised')
어떤 오류를 발생시킬지 신경 쓰지 않으면assert을 내다AssertionError:
>>> assert False, "Manually raised error"
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
assert False, "Manually raised error"
AssertionError: Manually raised error
>>>
assert하면, 「」가 합니다.AssertionError이 '일 경우'인False에는 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 이런False직접 에러를 발생시키지만, 에러를 발생시키는 텍스트가 있는 경우는, 쉼표를 붙여 에러 텍스트를 지정합니다.이 경우, 나는 다음과 같이 썼습니다.Manually raised error그 텍스트와 함께 올라갑니다.
발생한 예외에 관심이 없는 경우 다음을 수행합니다.
def crash(): return 0/0
0으로 나누면 좋은 구 나눗셈입니다.
언급URL : https://stackoverflow.com/questions/2052390/manually-raising-throwing-an-exception-in-python
'source' 카테고리의 다른 글
| MySQL 데이터베이스의 실제 크기를 얻는 방법 (0) | 2023.01.26 |
|---|---|
| 라라벨:속성별 컬렉션에서 개체 가져오기 (0) | 2023.01.26 |
| JUnit 테스트는 어떻게 하면 대기시킬 수 있나요? (0) | 2023.01.26 |
| 사전에서 키-값 쌍의 하위 집합을 추출하시겠습니까? (0) | 2023.01.26 |
| window.location을 클릭합니다.JavaScript의 href 및 window.open() 메서드 (0) | 2023.01.26 |