python异常处理2

异常堆栈跟踪

有时需要知道更多异常信息时,可以打印堆栈跟踪信息。堆栈跟踪信息可以通过python内置模块 traceback 提供的 print_exc() 函数实现,print_exc() 函数的语法格式如下:

traceback.print_exc(limit = None, file = None,chain = True)

其中,参数 limit 限制堆栈跟踪的个数,默认为 None 表示不限制;参数 file 为是否输出堆栈跟踪信息到文件,默认None 是不输出到文件; 参数 chain 为True,则将 _cause_ 和 _context_ 等属性串联起来,就像解释器本身打印未处理信息一样。

示例代码如下

import datetime as dt
import traceback as tb # 导入traceback模块并命名为 tbdef read_date_from_file(filename):try:file = open(filename)in_date = file.read()in_date = in_date.strip()date  = dt.datetime.strptime(in_date,'%Y-%m-%d')return dateexcept(ValueError,OSError) as e:print("调用方法method1处理...")tb.print_exc() # 打印异常堆栈信息date = read_date_from_file('openfile.txt')
print("日期 = {0}".format(date))

代码运行结果

Traceback (most recent call last):File "D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py", line 9, in read_date_from_filedate  = dt.datetime.strptime(in_date,'%Y-%m-%d')^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\86198\AppData\Local\Programs\Python\Python312\Lib\_strptime.py", line 554, in _strptime_datetimett, fraction, gmtoff_fraction = _strptime(data_string, format)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\86198\AppData\Local\Programs\Python\Python312\Lib\_strptime.py", line 333, in _strptimeraise ValueError("time data %r does not match format %r" %
ValueError: time data '' does not match format '%Y-%m-%d'
调用方法method1处理...
日期 = None

堆栈信息从上到下为程序执行过程中函数(或方法)的调用顺序,其中的每条信息明确指出了哪一个文件、哪一行、调用哪个函数或方法。

释放资源

有时 try--except 语句会占用一些资源,如打开文件、网络连接、打开数据库连接等,这些资源不能通过 python 的垃圾收集器回收,需要程序员释放,为了确保这些资源释放,可以使用 finally 代码块或 with as 自动资源管理。

finally代码块

try-except 代码块后面可以有finally代码块,次数无论 try 中的代码块正常结束还是 except 异常结束都会执行 finally 代码块。

在上面的程序中,只需要在 try-catch 代码块后加入下面的代码

    finally:file.close() # 关闭文件释放资源

 else代码块

try 语句月可以带有 else 代码块,它是在程序正常结束时执行的代码块,经过上面的更改(即加入finally代码块)会可以发现,程序仍不够完善,出现的问题是:若文件未成功打开,程序也会进入finally代码块执行 file.close()关闭文件,这会导致一些问题。可以加入 else 语句来解决

示例代码如下

import datetime as dt
import traceback as tb # 导入traceback模块并命名为 tbdef read_date_from_file(filename):'''如果正常打开文件,程序执行else代码块else中嵌套了try语句,在这个try文件中读取文件内容和解析日期最后在嵌套try对应的finally代码块中执行file.close()关闭文件'''try:file = open(filename)except(ValueError,OSError) as e:print("文件打开失败")tb.print_exc() # 打印异常堆栈信息else:print("文件打开成功")try:in_date = file.read()in_date = in_date.strip()date = dt.datetime.strptime(in_date, '%Y-%m-%d')return dateexcept(ValueError, OSError) as e:print("文件打开失败")tb.print_exc()  # 打印异常堆栈信息finally:file.close() # 关闭文件释放资源date = read_date_from_file('openfile.txt')
print("日期 = {0}".format(date))

with as代码块自动管理

上面更改后的代码虽然健壮,但程序流程比较复杂,这样的程序难以维护。python提供了 with as 代码块帮助自动释放资源,with as 提供的代码块中,在 as 后面声明一个资源变量,当with as 代码块结束之后自动释放资源。

示例代码如下

import datetime as dt
import traceback as tb # 导入traceback模块并命名为 tbdef read_date_from_file(filename):try:with open(filename) as file:in_date = file.read()in_date = in_date.strip()date = dt.datetime.strptime(in_date, '%Y-%m-%d')return dateexcept(ValueError,OSError) as e:print("文件打开失败")tb.print_exc() # 打印异常堆栈信息date = read_date_from_file('openfile.txt')
print("日期 = {0}".format(date))

在 with as 代码块中包含了资源对象相关代码,完成后自动释放资源。采用了自动资源管理后不再需要 finally 代码块,不需要自己释放资源。

注意:所有可以自动管理的资源,需要实现上下文管理协议。

自定义异常类

实现自定义异常类需要继承 Exception 类及其子类

示例代码如下

class MyException(Exception):def __init__(self,message): # 定义构造方法类,其中参数message是异常描述信息super.__init__(message) # 调用父类构造方法并把参数message传入给父类构造方法

显式抛出异常

前面提到的异常都是系统生成的,当异常抛出时,系统会创建一个异常对象,并将其抛出。我们自己也可以通过 raise 语句显式抛出异常,这样做的目的有很多,如:不想某些异常传给上层调用者,可以捕获之后程序显式抛出另外一种异常给调用者。raise 显式抛出的异常与系统生成并抛出的异常在处理方式上没有区别,都是要么捕获自己处理,要么抛出给上层调用者。

显式抛出异常语法格式如下:

raise BaseException 或其子类的实例

示例代码如下

import datetime as dt
class MyException(Exception):def __init__(self,message):super.__init__(message)def read_date_from_file(filename):try:file = open(filename)in_date = file.read()in_date = in_date.strip()date = dt.datetime.strptime(in_date,'%Y-%m-%d')return dateexcept ValueError as e:raise MyException('不是有效日期')except FileNotFoundError as e:raise MyException('文件找不到')except OSError as e:raise MyException('文件无法打开或无法读取')date = read_date_from_file('file.txt')
print('日期 = {0}'.format(date))

代码运行结果如下

Traceback (most recent call last):File "D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py", line 8, in read_date_from_filefile = open(filename)^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'During handling of the above exception, another exception occurred:Traceback (most recent call last):File "D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py", line 20, in <module>date = read_date_from_file('file.txt')^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py", line 16, in read_date_from_fileraise MyException('文件找不到')^^^^^^^^^^^^^^^^^^^^^^^^^File "D:\creation\PythonStudy\Pythonproject\mypro01\mypy01.py", line 4, in __init__super.__init__(message)
TypeError: descriptor '__init__' requires a 'super' object but received a 'str'Process finished with exit code 1

参考书籍:《python从小白到大牛》(第2版)关东升 编著 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/34685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mailbox驱动框架设计

文章目录 mailbox 驱动设计一、mailbox控制器/client驱动设计二、编译实例三、测试总结 mailbox 驱动设计 Mailbox&#xff08;邮箱&#xff09;是一种在多核系统中用于处理器间通信的机制。它允许不同的核心或处理器之间发送和接收消息&#xff0c;通常用于协调任务、同步状态…

【学一点儿前端】iOS微信小程序在密码input框中使用系统保存的密码后,密码v-model绑定值不更新的问题

碰到问题 又双叕碰到阴间bug&#xff0c;这回碰到了一生之敌iOS产生的兼容性问题 在iOS11中&#xff0c;支持密码的快速填充。这让iOS用户在微信小程序进行登录的时候&#xff0c;可以把当前账号密码保存进系统密码箱&#xff0c;之后再次登录时&#xff0c;输入账号后点击密码…

【软件工程】【22.04】p2

关键字&#xff1a; 软件开发分本质及涉及问题、需求规约与项目需求不同、用况图概念包含模型元素及其关系、创建系统的用况模型RUP进行活动、软件生存周期&软件生存周期模型&软件项目过程管理关系、CMMI基本思想 模块结构图&#xff1a;作用域、控制域&#xff1b;语…

【Linux命令】top linux下的任务管理器

一、概述 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。top是一个动态显示过程&#xff0c;即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令&#xff0c;它将独占前台&#…

kafka 和Zookeeper 集群架构设计对比分析

kafka 和Zookeeper 集群架构设计对比分析 Kafka 和 Zookeeper 是两个关键的分布式系统组件,它们在集群架构设计上有显著的差异。 下面是对它们在集群架构设计方面的对比分析。 1. Kafka 集群架构设计 1.1 基本架构 Kafka 是一个分布式消息系统,由多个 Broker 组成。每个 …

rust 引用了Trait的实现,为什么还需要引入Trait 才能调用实现的方法

文章目录 1. Rust中结构体实现trait与方法调用的关系2. 要调用trait方法,有几种方式:3. code 1. Rust中结构体实现trait与方法调用的关系 在Rust中,当一个结构体实现了某个trait时,不能直接通过结构体调用trait中定义的方法。这是因为: trait方法不是结构体的固有方法。它们是…

文献阅读(307)AccelWattch

题目&#xff1a;AccelWattch: A Power Modeling Framework for Modern GPUs时间&#xff1a;2021会议&#xff1a;MICRO研究机构&#xff1a;西北大学 本篇论文的主要贡献&#xff1a; 提出了一个GPU功耗模型&#xff0c;考虑了DVFS, thread divergence, intra-warp function…

关于PHP中删除JSON指定元素unset和array_splice的区别

1. unset(mixed $var, mixed ...$vars): void unset 不会改变原有索引顺序 ------------------------- 2. array_splice( array &$array, int $offset, ?int $length null, mixed $replacement [] ): array array_splice 删除后&#xff0c;会重新排序…

小程序人脸分析

公司的业务需求是用户在使用某个功能前&#xff0c;必须使用人脸识别&#xff0c;确保当前使用人是用户本人&#xff0c;防止某些功能乱用。后端用的是腾讯的人脸识别方案&#xff0c;这里只是前端的识别代码&#xff0c;保证人脸剧中&#xff0c;大小合适&#xff0c;有一个人…

四十二、 我国粤港澳大湾区个人信息出境标准合同如何签署和备?

《大湾区标准合同》是注册于&#xff08;适用于组织&#xff09;/位于&#xff08;适用于个人&#xff09;粤港澳大湾区内地部分&#xff0c;或者香港特别行政区的个人信息处理者&#xff08;就内地而言&#xff0c;是指在个人信息处理活动中自主决定处理目的、处理方式的组织、…

4418 HMI 更换logo 图片

逻辑说明&#xff1a; HMI 的 kernel 没有提供源码&#xff0c;只是提供了镜像&#xff0c;如果客户需要更换自己的logo 的话&#xff0c; 可以使用提供的工具&#xff0c;将内核logo 打包起来。 我觉得这里的打包的过程应该是参考了&#xff0c; 4418 build_android.sh 脚…

自然语言处理课程论文

目录 1.背景介绍 1.1 文献介绍 1.2 研究背景 1.3 知识概述 1.3.1 机器翻译 1.3.2 attention机制与self-attention机制 2.数据来源与处理 2.1 数据集描述 2.2 数据处理 3. 模型架构 ​​​​​​​3.1 Positional Embedding ​​​​​​​3.2 Multi-Head Attention ​​​​​…

Go interface{}类型转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

华为HCIP Datacom H12-821 卷13

1.多选题 以下关于二层漫游和三层漫游的描述,以下说法正确的是? A、如果 STA 漫游时前后关联的 VLAN ID 相同则一定属于二层漫游 B、二层漫游是指客户端在同一子网内漫游 C、三层漫游是指客户端在不同子网间漫游 D、三层漫游前后 STA 关联的 AP 服务集上的 VL AN 必须相…

awk

1、定义 awk&#xff1a;按行取列 awk的默认分隔符&#xff1a;空格&#xff0c;tab键&#xff0c;有多个空格自动压缩成一个 2、awk的工作原理 根据指定信息逐行的读取文本内容&#xff0c;然后按照条件进行格式化输出 3、awk的选项 -F&#xff1a;指定分割符&#xff0…

SQL Server - ROLLUP、GROUPING、CUBE、GROUPING SET

文章目录 SQL Server - ROLLUP、GROUPING、CUBE、GROUPING SETROLLUP函数GROUPING函数GROUPING SET函数CUBE函数网上例子 写在前面&#xff1a;如果我们想要对分组之后的数据进行类似小计的计算&#xff0c;那么就需要使用到下面的函数 SQL Server - ROLLUP、GROUPING、CUBE、G…

EMANE版本的编译问题

EMANE最新版本编译问题 在Ubuntu 18.04上编译EMANE最新版本 在ubuntu 18.04上使用make deb编译EMANE1.5.1时&#xff0c;会卡在如下地方&#xff1a; make[6]: Entering directory ‘/home/xxx/emane-1.5.1/.debbuild/emane-1.5.1’ /bin/bash /home/xxx/emane-1.5.1/.debbui…

YOLOv10剪枝|模型轻量化实现方案 - 模型剪枝手把手教学

📚 专栏地址:《YOLOv10算法改进实战》 👉 独家改进,对现有YOLOv10进行二次创新,提升检测精度,适合科研创新度十足,强烈推荐 🌟 统一使用 YOLOv10 代码框架,结合不同模块来构建不同的YOLO目标检测模型。 💥 本博客包含大量的改进方式,降低改进难度,改进点包含【B…

互联网IT公司网站选择科技蓝,从来没让人失望过。

选择科技蓝色作为IT官网的主题颜色有以下好处&#xff1a; 专业感&#xff1a;科技蓝色通常与科技、创新和专业相关联&#xff0c;使用科技蓝色可以给访问者一种专业、可靠的印象&#xff0c;增强品牌形象&#xff0c;特别适合IT行业。技术感&#xff1a;科技蓝色给人一种科技…

微信小程序笔记 七!

页面配置 1. 页面配置文件的作用 小程序中&#xff0c;每个页面都有自己的 .json 配置文件&#xff0c;用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 小程序中&#xff0c;app.json 中的 window 节点&#xff0c;可以全局配置小程序中每个…