处理 Python 断言错误并查找错误源

Shikha Chaudhary 2023年1月30日 2022年5月17日
  1. 在 Python 中处理断言错误并查找错误源
  2. 使用 Try-Except 块处理 Python 中的断言错误
  3. 使用带有 Try-Except 块的日志记录模块来处理 Python 中的断言错误
  4. 使用 Traceback 模块处理 Python 中的断言错误
  5. 在 Python 中使用 print 语句手动处理 AssertionError 异常
  6. 结论
处理 Python 断言错误并查找错误源

在本文中,我们将学习如何以不同的方式处理 Python 的断言错误。我们还看到了识别引发此错误的语句的方法。

在 Python 中处理断言错误并查找错误源

在 Python 中,我们可以使用 assert 语句来检查代码中的任何条件。如果条件为 True,则控制更进一步。

但是如果条件结果为 False,我们就会得到 AssertionError,程序的流程就会被打乱。

assert 语句的语法如下。

assert statement,message

这里,statement 是一个布尔语句。如果它评估为 False,程序将引发 AssertionError

message 是可选的,并在 AssertionError 发生时打印。如果 statement 的计算结果为 True,则什么也不会发生。

这就是 Python 引发 AssertionError 异常的方式。

assert True == False, "Whoops, something went wrong!"
print(True)

输出:

Traceback (most recent call last):
  File "Desktop/Tut.py", line 2, in <module>
    assert True == False, "Whoops, something went wrong!"
AssertionError: Whoops, something went wrong!

你可以观察到我们使用了语句 True==False,其计算结果为 False。因此,程序会引发 AssertionError 异常。

我们可以通过多种方式处理此异常。让我们一个接一个地浏览它们。

使用 Try-Except 块处理 Python 中的断言错误

尝试运行以下代码。

try:
    assert 123 == 256432
except AssertionError:
    print ("There is some problem!")

输出:

There is some problem!

在这里,assert 语句检查两个数字是否相等。由于这些数字不相等,AssertionError 异常从 try 块引发。

except 块捕获异常并执行打印语句。在这里,我们在异常块的 print 语句中获得了输出。

要知道异常的来源在哪里,我们可以使用 raise 关键字在 except 块中重新引发异常。

raise 关键字将在出现异常时引发错误并停止程序。它有助于跟踪当前的异常。

raise 语句的语法如下。

raise {exception class}

异常可以是内置异常,我们也可以创建自定义异常。我们还可以使用 raise 关键字打印一些消息并创建自定义异常。

raise Exception("print some string")

这个例子展示了 raise 关键字的工作原理。

try:
    assert 1 == 2
except AssertionError:
    print ("There is some problem!")
    raise

输出:

There is some problem!
Traceback (most recent call last):
  File "Desktop/Tut.py", line 2, in <module>
    assert 1 == 2
AssertionError

我们在上面代码的 except 块中重新引发了异常。你可以观察使用 raise 关键字如何在 line 2 中给出异常源。

通过这种方式,我们可以获得异常的行号以及引发代码的确切错误部分。

使用带有 Try-Except 块的日志记录模块来处理 Python 中的断言错误

Python 中的 logging 模块可帮助你跟踪应用程序的执行和错误。该模块跟踪任何操作期​​间发生的事件。

这在发生崩溃时很有帮助,因为我们可以从日志中找到以前的数据。因此,如果出现任何问题,我们可以回顾并找出导致错误的原因。

我们可以导入 logging 模块并在 except 块中使用 logging.error 方法。

import logging

try:
    assert True == False
except AssertionError:
    logging.error("Something is quite not right!", exc_info=True)

输出:

ERROR:root:Something is quite not right!
Traceback (most recent call last):
  File "Desktop/Tut.py", line 4, in <module>
    assert True == False
AssertionError

此方法还返回异常的行号和确切来源。

该模块有许多对象用于不同类型的错误消息。这些对象在记录器上记录具有级别的消息。

例如,Logger.critical(message) 记录具有 critical 级别的消息。Logger.error(message) 在上面的代码中记录级别 error 的消息。

使用 Traceback 模块处理 Python 中的断言错误

当代码有多个断言语句时,traceback 模块有助于捕捉错误的确切来源。

import sys
import traceback

try:
    assert 88 == 88
    assert 1 == 101
    assert True

except AssertionError:
    _, _, var = sys.exc_info()
    traceback.print_tb(var)
    tb_info =  traceback.extract_tb(var)
    filename, line_number, function_name, text = tb_info[-1]

    print("There is some error in line {} in this statement: {}".format(line_number, text))
    exit(1)

输出:

File "Desktop/Tut.py", line 6, in <module>
    assert 1 == 101
There is some error in line 6 in this statement:  assert 1 == 101

使用 traceback 模块,我们可以编写带有占位符 {}print 语句。

此外,我们可以指定不同的变量来保存文件名、行号、函数名和发生异常的文本。

这里,tb 指的是回溯对象。我们在 print 语句中只使用了两个占位符,一个用于行号,另一个用于文本。

sys.exc_info() 函数返回 raise 语句的三个部分 - exc_typeexc_tracebackexc_value。让我们在文件名的 print 语句中放置另一个占位符。

import sys
import traceback

try:
    assert 88 == 88
    assert 1 == 101
    assert True

except AssertionError:
    _, _, var = sys.exc_info()
    traceback.print_tb(var)
    tb_info =  traceback.extract_tb(var)
    filename, line_number, function_name, text = tb_info[-1]

    print("There is some error in the file {} on line {} in this statement: {}".format(filename, line_number, text))
    exit(1)

输出:

File "Desktop/Tut.py", line 6, in <module>
    assert 1 == 101
There is some error in the file Desktop/Tut.py on line 6 in this statement: assert 1 == 101

这次我们还得到了文件的完整 URL 作为文件名。

有关回溯模块的更多详细信息,请参阅此文档

在 Python 中使用 print 语句手动处理 AssertionError 异常

我们可以在 except 块中使用 print 语句来手动处理异常。

try:
    assert True == False, "Operation is invalid"
    print(True)

except AssertionError as warn:
    print(warn)

输出:

Operation is invalid

用户提供的任何错误消息都会进入 print 语句并被打印出来。这样,用户就不必担心技术错误。

显示一个简单的消息而不是错误。

结论

本文展示了我们如何在 Python 中处理 AssertionError。我们讨论了使用 raise 关键字、日志记录模块和回溯模块来处理断言错误。

我们还看到了如何使用简单的打印语句手动处理 AssertionError 异常。在实际应用中,不使用 AssertionError

如果你仅在开发和测试程序时使用它会有所帮助。

相关文章 - Python Error