当前位置: 首页 > 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…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...