2017-02-02 4 views
0

У меня есть заявление вроде этого.Как проверить, какая инструкция вызвала исключение?

Я просто хочу знать, какой из двух утверждений assert сделал исключение.

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, вы можете дать выражение после выражения теста утверждения; что второе выражение будет передано в 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  

Это второе выражение не должно быть строкой, это может быть что угодно. Поскольку утверждения должны использоваться только для проверки программной логики, а не для проверки пользовательских данных, я вообще не беспокоюсь о передаче строки с хорошо отформатированной строкой, я просто передаю кортеж, содержащий соответствующие значения, и, возможно, идентификационную строку. Например,

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

['traceback'] (https://docs.python.org/3/library/traceback.html) библиотека в python предоставляет множество утилит для извлечения дополнительной информации о поднятом исключении –

0

Вы можете распечатать последнее поднятое исключение с traceback.print_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 

Существует также traceback.format_exc() в случае, если вы не хотите печатать.

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' 
Смежные вопросы