迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

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

作者:迹忆客 最近更新:2023/03/07 浏览次数:

在本文中,我们将学习如何以不同的方式处理 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:
    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 中给出异常源。

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

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 模块有助于捕捉错误的确切来源。

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 作为文件名。

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

我们可以在 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

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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Django 中的 Slug

发布时间:2023/05/04 浏览次数:173 分类:Python

本篇文章旨在定义一个 slug 以及我们如何使用 slug 字段在 Python 中使用 Django 获得独特的帖子。

Django ALLOWED_HOSTS 介绍

发布时间:2023/05/04 浏览次数:181 分类:Python

本文展示了如何创建您的 Django 网站,为公开发布做好准备,如何设置 ALLOWED_HOSTS 以及如何在使用 Django 进行 Web 部署期间修复预期的主要问题。

Django 中的 Select_related 方法

发布时间:2023/05/04 浏览次数:129 分类:Python

本文介绍了什么是查询集,如何处理这些查询以及我们如何利用 select_related() 方法来过滤 Django 中相关模型的查询。

在 Django 中上传媒体文件

发布时间:2023/05/04 浏览次数:198 分类:Python

在本文中,我们简要介绍了媒体文件以及如何在 Django 项目中操作媒体文件。

Django 返回 JSON

发布时间:2023/05/04 浏览次数:106 分类:Python

在与我们的讨论中,我们简要介绍了 JSON 格式,并讨论了如何借助 Django 中的 JsonResponse 类将数据返回为 JSON 格式。

在 Django 中创建对象

发布时间:2023/05/04 浏览次数:59 分类:Python

本文的目的是解释什么是模型以及如何使用 create() 方法创建对象,并了解如何在 Django 中使用 save() 方法。

在 Django 中为多项选择创建字段

发布时间:2023/05/04 浏览次数:75 分类:Python

在本文中,我们将着眼于为多项选择创建一个字段,并向您展示如何允许用户在 Django 中进行多项选择。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便