当前位置: 首页 > news >正文

Python入门【​try和except结构、常见异常、with上下文管理 、traceback模块和生成异常日志、自定义异常类】(十八)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人
 

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战  

目录

try和except结构

try...一个except结构 

try...多个except结构 

try...except...else结构 

 try...except...finally结构

常见异常

with上下文管理 

traceback模块和生成异常日志

自定义异常类


try和except结构

 

try...一个except结构 

try...except 是最常见的异常处理结构。结构如下:

try:被监控的可能引发异常的语句块
except  BaseException [as  e]:异常处理语句块

1 、try 块包含着可能引发异常的代码, except 块则用来捕捉和处理发生的异常。

2 、执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码;

3、执行的时候,如果 try 块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。

 【示例】遇到异常的执行顺序

#测试简单的0不能做除数异常
try:print("step1")a = 3/0print("step2")
except BaseException as e:print("step3")print(e)
print("step4")

除数为 0 ,遇到异常输出结果:

step1

step3

division by zero

step4 

【示例】循环输入数字,如果不是数字则处理异常;直到输入 88 , 则结束循环。 

while True:try:x = int(input("请输入一个数字:"))print("您入的数字是",x)if x==88:print("退出程序")breakexcept:print("异常:输入的不是一个数字")

 执行结果:

执行结果:

请输入一个数字:10

您入的数字是 10

请输入一个数字:abc

异常:输入的不是一个数字

请输入一个数字:88

您入的数字是 88

退出程序

try...多个except结构 

上面的结构可以捕获所有的异常,工作中也很常见。但是,从经典理论考虑,一般建议尽量捕获可能出现的多个异常(按照先子类后 父类的顺序),并且针对性的写出异常处理代码。为了避免遗漏可能出现的异常,可以在最后增加 BaseException 。结构如下: 

try:被监控的、可能引发异常的语句块
except  Exception1:处理Exception1的语句块
except  Exception2:处理Exception2的语句块[...]
except  BaseException:处理可能遗漏的异常的语句块

 【示例】多个 except 结构

try:a = input("请输入被除数:")b = input("请输入除数:")c = float(a)/float(b)print(c)
except ZeroDivisionError:print("异常:除数不能为0")
except TypeError:print("异常:除数和被除数都应该为数值类型")
except BaseException as e:print(e)print(type(e))

执行结果:

请输入被除数:10

请输入除数:0

异常:除数不能为0

try...except...else结构 

try...except...else 结构增加了 else块 。如果 try 块中没有抛出异常,则执行 else 块。如果 try 块中抛出异常,则执行 except 块,不执行 else 块。

【示例】 try...except...else 结构执行测试

try:a = input("请输入被除数:")b = input("请输入除数:")c = float(a)/float(b)
except BaseException as e:print(e)
else:print("除的结果是:",c)

发生异常的执行情况(执行 except 块,没有执行 else ):

请输入被除数:5

请输入除数:0

float division by zero

没有发生异常的执行情况(执行完 try 块后,执行 else ):

请输入被除数:10
请输入除数:5
除的结果是: 2.0

 try...except...finally结构

try...except...finally 结构中, finally 块无论是否发生异常都会被执行;通常用来释放 try 块中申请的资源。 

【示例】 try...except...finally 结构简单测试 

try:a = input("请输入一个被除数:")b = input("请输入一个除数:")c = float(a)/float(b)
except BaseException as  e:print(e)
else:print(c)
finally:print("我是finally中的语句,无论发生异常与否,都执行!")
print("程序结束!")

执行结果如下:

请输入被除数:10
请输入除数:0
float division by zero
我是finally中的语句,无论是否发生异常都执行

【示例】读取文件, finally 中保证关闭文件资源

try:f = open("d:/a.txt",'r')content = f.readline()print(content)
except BaseException as e:print(e)
finally:f.close()       #释放资源。此处也可能会发生异常。若发生异常,则程序终止,不会继续往下执行
print("step4")

发生异常的执行结果:

Traceback (most recent call last):
[Errno 2] No such file or directory:'d:/a.txt'File "...mypro_exception/my01.py", line 8, in <module>f.close()       #释放资源。此处也可能会发生异常。若发生异常,则程序终止,不会继续往下执行
NameError: name 'f' is not defined
Process finished with exit code 1

return语句和异常处理问题

由于 return 有两种作用:结束方法运行、返回值。我们一般不把 return 放到异常处理结构中,而是放到方法最后。

【示例】 return 和异常结构的正确处理方式

    print("step1")try:x = 3/0# return "a"except:print("step2")print("异常:0不能做除数")#return "b"finally:print("step4")#return "d"print("step5")return "e"         #一般不要将return语句放到try、except、else、finally块中,会发生一些意想不到的错误。建议放到方法最后。
print(test01())

执行结果:

step1
step2
异常:0不能做除数
step4
step5
e

常见异常

常见异常的解决

Python中的异常都派生自 BaseException 类,本节我们测试和列出常见的一些异常,方便初学者掌握。 

1、SyntaxError :语法错误

    int a =3^
SyntaxError: invalid syntax

2、 NameError :尝试访问一个没有申明的变量

    print(a)
NameError: name 'a' is not defined

 3、 ZeroDivisionError :除数为0错误(零除错误)

    a = 3/0
ZeroDivisionError: division by zero

4、 ValueError :数值错误

    float("xiaotong")
ValueError: could not convert string to
float: 'xiaotong'

5 、TypeError :类型错误

    123+"abc"
TypeError: unsupported operand type(s) for +: 'int' and 'str'

6、 AttributeError :访问对象的不存在的属性

a=100
a.sayhi()AttributeError: 'int' object has no
attribute 'sayhi'

7 、IndexError :索引越界异常

a = [4,5,6]
a[10]IndexError: list index out of range

8、 KeyError :字典的关键字不存在

a = {'name':"xiaotong",'age':18}
a['salary']KeyError: 'salary'

常见异常汇总

建议大家通读,把异常相关的单词背下来熟悉一下。这样可以克服 “畏难情绪”。

 

with上下文管理 

finally 块由于是否发生异常都会执行,通常我们放释放资源的代码。 其实,我们可以通过 with 上下文管理,更方便的实现释放资源的操作。 

with 上下文管理的语法结构如下:

with  context_expr [ as  var]:语句块

with 上下文管理可以自动管理资源,在 with 代码块执行完毕后自 动还原进入该代码之前的现场或上下文。不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用。

【示例】 with 上下文管理文件操作

 

with open("d:/bb.txt") as f:for line in f:print(line)

执行结果:

xiaotong
txc
wangxiao

traceback模块和生成异常日志

【示例】使用 traceback 模块打印异常信息

 

import traceback
try:print("step1")num = 1/0
except:traceback.print_exc()

运行结果:

step1
Traceback (most recent call last):File "...mypro_exception/my01.py", line 7,
in <module>num = 1/0
ZeroDivisionError: division by zero
Process finished with exit code 0

【示例】使用 traceback 将异常信息写入日志文件

#coding=utf-8
import traceback
try:print("step1")num = 1/0
except:with open("d:/a.log","a") as f:traceback.print_exc(file=f)

自定义异常类

程序开发中,有时候我们也需要自己定义异常类。自定义异常类一 般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error 、 Exception 为后缀。 

自定义异常由 raise 语句主动抛出。

【示例】自定义异常类和raise语句

#测试自定义异常类
class AgeError(Exception):  #继承Exceptiondef __init__(self,errorInfo):Exception.__init__(self)self.errorInfo = errorInfodef __str__(self):return str(self.errorInfo)+",年龄错误!应该在1-150之间"
############测试代码################
if __name__ == "__main__":   #如果为True,则模块是作为独立文件运行,可以执行测试代码age = int(input("输入一个年龄:"))if age<1 or age>150:raise AgeError(age)else:print("正常的年龄:",age)

 执行结果:

输入一个年龄:200
Traceback (most recent call last):File "...mypro_exception/my10.py", line 16,in <module>raise AgeError(age)
__main__.AgeError: 200,年龄错误!应该在1-150之间

自定义异常类一般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error 、 Exception 为后缀。 自定义异常由 raise 语句主动抛出。

 

相关文章:

Python入门【​try和except结构、常见异常、with上下文管理 、traceback模块和生成异常日志、自定义异常类】(十八)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…...

windows脚本获取管理员权限修改host

很多时候我们常常需要通过管理员权限执行脚本&#xff0c;脚本可能涉及到一些受保护信息的访问&#xff0c;我们写个简单的脚本来更改host文件&#xff0c;host文件就是需要管理员权限才能访问的启动脚本时先检查是否有管理员权限&#xff0c;如果没有就调用授权脚本进行管理员…...

Flask简介与基础入门

一、了解框架 Flask作为Web框架&#xff0c;它的作用主要是为了开发Web应用程序。那么我们首先来了解下Web应用程序。Web应用程序 (World Wide Web)诞生最初的目的&#xff0c;是为了利用互联网交流工作文档。 1、一切从客户端发起请求开始。 所有Flask程序都必须创建一个程序…...

Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情。 写在前面 本篇文章的主角是开源项目 TencentARC/GFPGAN&#xff0c;和上一篇文章《Stable Diffusion 硬核生存指南&#xff1a;WebUI 中的 CodeFormer》提…...

IO模型-信号驱动IO

linux内核中存在一个信号SIGIO&#xff0c;这个信号就是用于实现信号驱动IO的。当应用程序中想要以信号驱动IO的模型读写硬件数据时&#xff0c;首先注册一个SIGIO信号的信号处理函数,当硬件数据就绪&#xff0c;硬件会发起一个中断&#xff0c;在硬件的中断处理函数中向当前进…...

每日一题——回文链表

回文链表 题目链接 回文结构即字符串正序逆序完全一致&#xff0c;如“1 2 3 4 3 2 1”&#xff0c;那么我们就要想办法同时比较链表头和链表尾的元素&#xff0c;看其是否相等。 下面介绍一种最常用的方法&#xff1a; 思路 如果我们仔细观察回文结构&#xff0c;就会得到一…...

OPENCV C++(一) 二进制和灰度原理 处理每个像素点值的方法

#include <opencv2/opencv.hpp> using namespace std; using namespace cv;必须包含的头文件&#xff01; 才能开始编写代码 读取相片 一般来说加个保护程序 不至于出error和卡死 Mat image imread("test.webp"); //存放自己图像的路径 if (image.empty()){p…...

Python GUI编程(Tkinter)

Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库&#xff0c;几个常用 Python GUI 库如下&#xff1a; Tkinter&#xff1a; Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows …...

K8S简介

目录 前言K8S 简介K8S 是什么作用Kubernetes 主要功能如下&#xff1a;Kubernetes 集群架构与组件 核心组件Master 组件Kube-apiserverKube-controller-managerKube-scheduler配置存储中心 etcd Node 组件KubeletKube-Proxydocker 或 rocket Kubernetes 核心概念PodPod控制器La…...

策略模式——算法的封装与切换

1、简介 1.1、概述 在软件开发中&#xff0c;常常会遇到这种情况&#xff0c;实现某一个功能有多条途径。每一条途径对应一种算法&#xff0c;此时可以使用一种设计模式来实现灵活地选择解决途径&#xff0c;也能够方便地增加新的解决途径。为了适应算法灵活性而产生的设计模…...

c++转换构造,拷贝构造,operator=

c转换构造&#xff0c;拷贝构造&#xff0c;operator 一.转换构造 定义一个类 class CTest { public:int m_a;CTest(int m_a):m_a(0){} };在主函数中定义对象 CTest tes1(1); CTest tes2 5;//我们发现这种定义对象的方式不符合常理&#xff0c;这里其实是发生了隐式类型转…...

支付宝蜻蜓设备abs调试

蜻蜓设备系统日志调试 1、蜻蜓设备进入开发者模式 长按关键键直到屏幕上出现设置按钮&#xff0c;点击设置按钮&#xff0c;选择关于本机&#xff0c;找到系统版本&#xff0c;连续点击8次&#xff0c;选择进入调试模式 2、找到小程序容器&#xff0c;连续点击8次&#xff0…...

论memset的时间代价

论memset的时间代价 众所周知&#xff0c;memset是一个常用的数组赋值方式&#xff0c;几乎每个OI player全都使用过&#xff0c;但是这个函数从来不要脸&#xff0c;也不给你脸。 大家耳顺能详的几个例子&#xff1a; ①memset(a,0,sizeof(a));把a全赋值成0。 ②memset(a,…...

linux下绑定进程到指定CPU的操作方法

taskset简介 # taskset Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] Show or change the CPU affinity of a process. Options: -a, --all-tasks operate on all the tasks (threads) for a given pid -p, --pid operate on ex…...

springboot+maven插件调用mybatis generator自动生成对应的mybatis.xml文件和java类

mybatis最繁琐的事就是sql语句和实体类&#xff0c;sql语句写在java文件里很难看&#xff0c;字段多的表一开始写感觉阻力很大&#xff0c;没有耐心&#xff0c;自动生成便成了最称心的做法。自动生成xml文件&#xff0c;dao接口&#xff0c;实体类&#xff0c;虽一直感觉不太优…...

C# 根据前台传入实体名称,动态查询数据

前言&#xff1a; 项目中时不时遇到查字典表等数据&#xff0c;只需要返回数据&#xff0c;不需要写其他业务&#xff0c;每个字典表可能都需要写一个接口给前端调用&#xff0c;比较麻烦&#xff0c;所以采用下面这种方式&#xff0c;前端只需传入实体名称即可&#xff0c;例…...

Netty入门学习

目录 为什么要学习nettynetty学习导图学习netty前需要知道的知识I/O模型主要I/O模型 netty框架的整体结构netty的逻辑架构网络通信层事件调度层服务编排层 为什么要学习netty Netty是由JBOSS提供的一个Java开源框架&#xff0c;现为Github上的独立项目。Netty本质是一个NIO框架…...

代客泊车对HUT功能交互规范

目录 1. 版本记录... 7 2. 文档范围和控制... 8 2.1 目的/范围... 8 2.2 文档冲突... 8 2.3 文档授权... 8 2.4 文档更改控制... 8 3. 系统组成... 9 3.1 IPAS系统&#xff08;环视和超声波雷达&#xff09;...…...

mysql的update_time

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 );具体解释如下&#xff1a; DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…...

避免安装这5种软件,手机广告频繁弹窗且性能下降

在我们使用手机的日常生活中&#xff0c;选择合适的应用软件对于保持良好的使用体验至关重要。然而&#xff0c;有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序&#xff0c;我们应该尽量避免安装它们。 首先第一种&#xf…...

实验室服务器远程访问终极方案:SSH 反向隧道 + systemd 自动重连

&#x1f680; 实验室服务器远程访问终极方案&#xff1a;SSH 反向隧道 systemd 自动重连适用于&#xff1a; 没有公网 IP 的实验室服务器想用 VSCode / SSH / Jupyter 远程开发希望稳定、自动重连、开机自启&#x1f9e0; 一、问题背景 在很多实验室环境中&#xff1a; GPU 服…...

时间序列分类新范式:从技术突破到商业落地全指南

时间序列分类新范式&#xff1a;从技术突破到商业落地全指南 【免费下载链接】InceptionTime 项目地址: https://gitcode.com/gh_mirrors/in/InceptionTime 时间序列分类是数据分析领域的核心挑战&#xff0c;传统方法往往在多尺度特征捕捉、实时性分析和复杂场景适应性…...

**发散创新:服务端渲染(SSR)的深度实践与性能优化实战**在现代前端架构

发散创新&#xff1a;服务端渲染&#xff08;SSR&#xff09;的深度实践与性能优化实战 在现代前端架构中&#xff0c;服务端渲染&#xff08;Server-Side Rendering, SSR&#xff09; 已不再是“可选特性”&#xff0c;而是提升首屏加载速度、SEO友好度和用户体验的核心手段之…...

Acetic Acid-PEG-Silane,与蛋白质、抗体或核酸的氨基通过酰胺键连接

一.名称英文名&#xff1a;AA-PEG-Silane&#xff0c;Acetic Acid-PEG-Silane&#xff0c;Silane-PEG-AA&#xff0c;Silane-PEG-Acetic Acid中文名&#xff1a;乙酸聚乙二醇三乙氧基硅烷&#xff0c;乙酸-PEG-三乙氧基硅烷&#xff0c;三乙氧基硅烷聚乙二醇羟基&#xff0c;硅…...

自动化抢票工具:从技术原理到实战部署的全流程解析

自动化抢票工具&#xff1a;从技术原理到实战部署的全流程解析 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 在票务销售场景中&#xff0c;人工操作面临三大核心痛点&#xff1a;页面刷新延迟导…...

云服务器是如何保障数据安全的

在云服务器中&#xff0c;访问控制机制是重要的安全屏障。云服务商会实施严格的身份认证&#xff0c;用户需要通过密码、密钥、生物识别等多种方式进行身份验证&#xff0c;只有通过验证的用户才能获得相应的操作权限。同时&#xff0c;基于角色的访问控制将用户分配到不同角色…...

禅道最新22.0+ 手动删除无法安装之清理卸载办法

禅道项目管理软件卸载方法详解&#xff1a;如何彻底清除所有相关文件和配置在企业或个人开发环境中&#xff0c;禅道&#xff08;Zentao&#xff09;作为一款广受欢迎的开源项目管理工具&#xff0c;因其功能全面、易用性强而被广泛使用。然而&#xff0c;在某些情况下&#xf…...

黑客用ChatGPT生成病毒:安全测试员的噩梦

当攻击进入“自动化”时代对于软件测试从业者而言&#xff0c;每一次技术革新都意味着测试对象、方法和工具的深刻变革。过去&#xff0c;我们面对的是由人类程序员编写的、逻辑相对固定的代码。然而&#xff0c;大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;特别是…...

二次封装ElementUI日期范围组件:打造带限制规则的Vue2 v-model响应式通用组件

二次封装ElementUI日期范围组件&#xff1a;打造带限制规则的Vue2 v-model响应式通用组件 在基于Vue2ElementUI的后台系统开发中&#xff0c;日期范围选择器是高频使用的表单组件。原生组件虽满足基础选择需求&#xff0c;但面对日期范围限制&#xff08;最长90天&#xff09;、…...

FireRedASR Pro效果展示:长难句识别准确,抗噪能力惊艳

FireRedASR Pro效果展示&#xff1a;长难句识别准确&#xff0c;抗噪能力惊艳 1. 语音识别新标杆 在嘈杂的会议室里&#xff0c;一段夹杂着咳嗽声和键盘敲击的录音正在播放。令人惊讶的是&#xff0c;FireRedASR Pro几乎一字不差地将这段对话转换成了文字&#xff0c;连专业术…...