Python(二十八)python 获取异常信息

简介: 在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。那么,我们应该如何看到报错信息呢?Python中为我们提供了两个可以查看标错信息的库,sys 模块中的 exc_info,traceback 模块这是我们第一次使用python的模块在文件中使用python的模块,需要引入才可以使用。 一:使用 sys 模块中的 exc_info 方法:1:exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是:type:异常类型的名称,python异常类型请参照

在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。

那么,我们应该如何看到报错信息呢?

Python中为我们提供了两个可以查看标错信息的库,sys 模块中的 exc_info,traceback 模块

这是我们第一次使用python的模块

在文件中使用python的模块,需要引入才可以使用。

一:使用 sys 模块中的 exc_info 方法:

1:exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是:

type:异常类型的名称,python异常类型请参照菜鸟教程《Python 异常处理

value:捕获到的异常实例。

traceback:是一个 traceback 对象。

2:使用实例

python

复制代码

import sys
try:
    a = input("请输入一个数:")
    #判断用户输入的是否为数字
    if(not a.isdigit()):
        raise ValueError("a 必须是数字")
except ValueError as e:
    print(sys.exc_info())
    print("引发异常:",e)

输出:

请输入一个数:a
(<class 'ValueError'>, ValueError('a 必须是数字'), <traceback object at 0x00000209CCC19188>)

引发异常: a 必须是数字

我们通过返回值可以看出,sys.exc_info()返回的是一个元组,第一个值是异常的类型,第二个值是带异常信息,第三个值是一个 traceback 对象,无法直接看出有关异常的信息,还需要对其做进一步处理。

我们来修改一下上边的实例:

python

复制代码

import sys
import traceback
try:
    a = int(input("请输入一个数:"))
    #判断用户输入的是否为数字
    print("30除以", a, "等于", 30 / a)
except ValueError as e:
    # print(sys.exc_info())
    traceback.print_tb(sys.exc_info()[2])
    print("引发异常:",e)

输出:

arduino

复制代码

请输入一个数:0
Traceback (most recent call last):
  File "F:/camellia/python/testProject/main.py", line 51, in <module>
    import errorr
  File "F:\camellia\python\testProject\errorr.py", line 81, in <module>
    print("30除以", a, "等于", 30 / a)
ZeroDivisionError: division by zero

 

二:使用 traceback 模块中的相关函数:

traceback 模块,可以用来查看异常的传播轨迹,追踪异常触发的源头。

我看到了一个大神用来演示traceback的代码实例:

ruby

复制代码

class SelfException(Exception):
    pass
def mains():
    firstMethod()
def firstMethod():
    secondMethod()
def secondMethod():
    thirdMethod()
def thirdMethod():
    raise SelfException("自定义异常信息")
mains()

上面程序中 main() 函数调用 firstMethod(),firstMethod() 调用 secondMethod(),secondMethod() 调用 thirdMethod(),thirdMethod() 直接引发一个 SelfException 异常。运行上面程序,将会看到如下所示的结果:

arduino

复制代码

Traceback (most recent call last):
  File "F:/camellia/python/testProject/main.py", line 51, in <module>
    import errorr
  File "F:\camellia\python\testProject\errorr.py", line 99, in <module>
    mains()
  File "F:\camellia\python\testProject\errorr.py", line 91, in mains
    firstMethod()
  File "F:\camellia\python\testProject\errorr.py", line 93, in firstMethod
    secondMethod()
  File "F:\camellia\python\testProject\errorr.py", line 95, in secondMethod
    thirdMethod()
  File "F:\camellia\python\testProject\errorr.py", line 97, in thirdMethod
    raise SelfException("自定义异常信息")
errorr.SelfException: 自定义异常信息

 

从输出结果可以看出,异常从 thirdMethod() 函数开始触发,传到 secondMethod() 函数,再传到 firstMethod() 函数,最后传到 mains() 函数,在 mains() 函数止,这个过程就是整个异常的传播轨迹。

我们可以通过这个轨迹,来追寻整个报错的源头

traceback模块有两个常用方法:

(1):traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件中。

(2):format_exc():将异常传播轨迹信息转换成字符串。

我们使用traceback.print_exc()来修改一下上边的示例:

scss

复制代码

import traceback
class SelfException(Exception):
    pass
def mains():
    firstMethod()
def firstMethod():
    secondMethod()
def secondMethod():
    thirdMethod()
def thirdMethod():
    raise SelfException("自定义异常信息")
try:
    mains()
except:
    # 捕捉异常,并将异常传播信息输出控制台
    traceback.print_exc()
    # 捕捉异常,并将异常传播信息输出指定文件中(log.txt在当前代码运行目录中)
    traceback.print_exc(file=open('log.txt', 'a'))

更多应用,请参照《Python3 错误和异常

有好的建议,请在下方输入您的评论。

目录
相关文章
|
10天前
|
Kubernetes API 开发工具
【Azure Developer】通过SDK(for python)获取Azure服务生命周期信息
需要通过Python SDK获取Azure服务的一些通知信息,如:K8S版本需要更新到指定的版本,Azure服务的维护通知,服务处于不健康状态时的通知,及相关的操作建议等内容。
38 18
|
16天前
|
存储 算法 安全
Python案例分享:如何实现信息的加解密
Python案例分享:如何实现信息的加解密
24 10
|
14天前
|
Python
惊!Python进程间通信IPC,让你的程序秒变社交达人,信息畅通无阻
【9月更文挑战第13天】在编程的世界中,进程间通信(IPC)如同一场精彩的社交舞会,每个进程通过优雅的IPC机制交换信息,协同工作。本文将带你探索Python中的IPC奥秘,了解它是如何让程序实现无缝信息交流的。IPC如同隐形桥梁,连接各进程,使其跨越边界自由沟通。Python提供了多种IPC机制,如管道、队列、共享内存及套接字,适用于不同场景。通过一个简单的队列示例,我们将展示如何使用`multiprocessing.Queue`实现进程间通信,使程序如同社交达人般高效互动。掌握IPC,让你的程序在编程舞台上大放异彩。
13 3
|
1月前
|
存储 BI Python
【python】python酒店客房管理信息系统(源码+论文)【独一无二】
【python】python酒店客房管理信息系统(源码+论文)【独一无二】
【python】python酒店客房管理信息系统(源码+论文)【独一无二】
|
29天前
|
Python
炫酷!纯Python开发LOL英雄信息查询平台
炫酷!纯Python开发LOL英雄信息查询平台
|
2月前
|
网络安全 数据安全/隐私保护 网络虚拟化
|
1月前
|
数据采集 机器学习/深度学习 算法
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
【python】python客户信息审计风险决策树算法分类预测(源码+数据集+论文)【独一无二】
|
1月前
|
数据采集 存储 数据可视化
基于Python 网络爬虫和可视化的房源信息的设计与实现
本文介绍了一个基于Python Scrapy框架和echart库的房源信息采集与可视化系统,该系统通过自动化爬虫提高房地产数据采集效率,并通过Flask服务器实现数据的Web可视化展示,旨在帮助房地产从业人员和政策制定者高效、直观地了解房源信息。
|
1月前
|
机器学习/深度学习 开发工具 Python
【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)
【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)
|
1月前
|
API C++ Python
【Azure 应用服务】Python fastapi Function在Azure中遇见AttributeError异常(AttributeError: 'AsgiMiddleware' object has no attribute 'handle_async')
【Azure 应用服务】Python fastapi Function在Azure中遇见AttributeError异常(AttributeError: 'AsgiMiddleware' object has no attribute 'handle_async')