如何检查哪个语句抛出异常?

时间:2017-02-02 07:10:20

标签: python exception error-handling exception-handling

我有这样的陈述。

我只是想知道两个断言语句中的哪一个抛出异常。

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

感谢您的回答。

4 个答案:

答案 0 :(得分: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 :(得分: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'

答案 2 :(得分:0)

您可以使用>>> 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()

如果您不想打印,还有HKStatisticsQuery

答案 3 :(得分: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()

然后你可以打印出信息。