2017-02-02 2 views
0

나는 이와 같은 진술을 가지고있다.예외를 던진 구문을 확인하는 방법은 무엇입니까?

두 개의 assert 문 중 예외를 throw 한 것이 무엇인지 알고 싶습니다.

try: 
    assert re.search("xyz", statement) 
    assert re.search("abc", statement) 
except AssertionError: 
    print "AssertionError : Expected Error message not found" 

답변 해 주셔서 감사합니다.

+0

두 문장을 구별하려면 각 문장에 대해 'try/except' 블록을 별도로 사용하십시오. – BrenBarn

+2

가장 간단한 해결책은'try' /'expect'를 제거하는 것입니다. –

+0

@KlausD. 공정한 코멘트이지만 Logesh는 그 블록에있는 어떤 AssertionError가 제기 된 후에도 실행을 계속하고자합니다. 물론, 그것은 일반적으로 안전한 전략은 아니지만, 때로는 유용합니다. 데모와 같습니다. –

답변

1

The assert statement docs에서 언급했듯이 어설 션 테스트 표현식 뒤에 표현식을 사용할 수 있습니다. 두 번째 표현식이 AssertionError에 전달됩니다.

for n in (-5, 10, 20): 
    try: 
     assert 0 <= n, '%d is too low' % n 
     assert n <= 10, '%d is too high' % n 
     print('%d is ok' % n) 
    except AssertionError as err: 
     print "AssertionError:", err 

출력

AssertionError: -5 is too low                             
10 is ok                                  
AssertionError: 20 is too high  

초 expression이 문자열을 할 필요가 없다는 것, 그것이 무엇이든 할 수있다 : 다음은 간단한 데모입니다. 어서션은 사용자 논리 데이터를 검증하는 것이 아니라 프로그램 논리를 검증하는 데에만 사용해야하므로 일반적으로 멋지게 형식화 된 문자열을 전달하는 것을 신경 쓰지 않고 관련 값을 포함하는 튜플과 식별 문자열을 전달합니다. 예,

assert (a * b > c), ('Bad product', a, b, c) 
+1

파이썬의 ['traceback'] (https://docs.python.org/3/library/traceback.html) 라이브러리는 제기 된 예외에 대한 더 많은 정보를 추출 할 수있는 많은 유틸리티를 제공합니다 –

0

당신은 traceback.print_exc()와 마지막 발생한 예외를 인쇄 할 수 있습니다. 예 : 경우에도 traceback.format_exc() 있습니다

>>> import traceback 
>>> try: 
... a = 1/0 
... except: 
... traceback.print_exc() 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ZeroDivisionError: integer division or modulo by zero 

인쇄하지 않습니다.

0

아마도 예외를 다르고 싶습니까? 그럼 Getting exception details in Python 당신을 도울 수 있습니다. 대답 복사 :

import sys 
try: 
    assert re.search("xyz", statement) 
    assert re.search("abc", statement) 
except AssertionError: 
    type, value, traceback = sys.exc_info() 

그런 다음 정보를 인쇄 할 수 있습니다.

1

traceback 모듈의 기능을 사용할 수 있습니다. 예를 들어 extract_tb은 스택 추적 항목을 나타내는 튜플 목록 (Python 3.5 이상의 튜플 이름)을 반환합니다. 각 튜플에는 줄 번호와 원본 텍스트 줄 (사용 가능한 경우)이 포함됩니다.

import traceback 

try: 
    assert 1 
    assert None 
except AssertionError as e: 
    for x in traceback.extract_tb(e.__traceback__, limit=-1): 
     print(x.lineno, repr(x.line)) # Prints 5 'assert None' 
관련 문제