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

Shikha Chaudhary 2023年1月30日
  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