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 错误和异常

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

目录
相关文章
|
2月前
|
Python
Python编程获取当前日期的所属周日期信息
Python编程获取当前日期的所属周日期信息
53 1
|
1月前
|
缓存 监控 Linux
Python 实时获取Linux服务器信息
Python 实时获取Linux服务器信息
|
1月前
|
测试技术 开发者 Python
对于Python中的异常要如何处理,raise关键字你真的了解吗?一篇文章带你从头了解
`raise`关键字在Python中用于显式引发异常,允许开发者在检测到错误条件时中断程序流程,并通过异常处理机制(如try-except块)接管控制。`raise`后可跟异常类型、异常对象及错误信息,适用于验证输入、处理错误、自定义异常、重新引发异常及测试等场景。例如,`raise ValueError(&quot;Invalid input&quot;)`用于验证输入数据,若不符合预期则引发异常,确保数据准确并提供清晰错误信息。此外,通过自定义异常类,可以针对特定错误情况提供更具体的信息,增强代码的健壮性和可维护性。
|
28天前
|
Python
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
43 5
|
29天前
|
Python
在Python中,自定义函数可以抛出自定义异常
在Python中,自定义函数可以抛出自定义异常
44 5
|
29天前
|
存储 开发者 Python
自定义Python的异常
自定义Python的异常
16 5
|
2月前
|
存储 索引 Python
|
1月前
|
存储 数据采集 数据库
用 Python 爬取淘宝商品价格信息时需要注意什么?
使用 Python 爬取淘宝商品价格信息时,需注意法律和道德规范,遵守法律法规和平台规定,避免非法用途。技术上,可选择 Selenium 和 Requests 库,处理反爬措施如 IP 限制、验证码识别和请求频率控制。解析页面数据时,确定数据位置并清洗格式。数据存储可选择 CSV、Excel、JSON 或数据库,定期更新并去重。还需进行错误处理和日志记录,确保爬虫稳定运行。
|
1月前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
2月前
|
Python
Python生成器、装饰器、异常
【10月更文挑战第15天】