处理 Python 断言错误并查找错误源
- 在 Python 中处理断言错误并查找错误源
-
使用
Try-Except
块处理 Python 中的断言错误 -
使用带有
Try-Except
块的日志记录模块来处理 Python 中的断言错误 - 使用 Traceback 模块处理 Python 中的断言错误
-
在 Python 中使用
print
语句手动处理AssertionError
异常 - 结论
在本文中,我们将学习如何以不同的方式处理 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_type
、exc_traceback
和 exc_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
。
如果你仅在开发和测试程序时使用它会有所帮助。