Python保姆式手把手带你掌握异常的捕获和处理

目录
  • 👀前言
  • ⚡一、异常的定义
  • 🙊二、异常的处理
    • 1.try-except
    • 2.try-except-except
    • 3.try-except-else
    • 4.try-except-finally
    • 5.顶层类Exception
  • 🙈三、自定义异常
  • 💤结语

👀前言

代码出现异常而报错再正常不过了,但为什么要处理异常?

由于异常的存在,代码运行时会出现一大堆的红色字体提示,对于程序员还好,见红色报错见多了习惯了,但如果你开发出来的东西要给别人看,那么不懂代码的人就会一脸懵逼,对产品的印象都不太好了。

比如我们经常简单网页丢失的情况,其实是就是网页代码执行时发生了异常,但有的网页还是很个性的,提示的信息可能是比较人性化的,比如CSDN你收藏的文章被后台删除了,导致直接跳到这个界面的代码无法执行,此时的报错信息是这样的:

但有些产品在开发时想得并不是那么周到,没有体会用户端的感受,结果某个程序出错了,用户能看到一堆报错代码,好感度直线下降。

首先这篇文章所讲的异常不是指教你如何让代码不报错,代码异常出错得进行调试来解决,这不是我们这里的重点,今天的重点是在代码可能报错的地方进行优化和个性化,让错误看起来也比较和谐。

其次这也是Python新手入门教程系列文章的一个重要板块,可以给以后的开发奠定良好的异常处理基础,代码总会有异常,但有的异常在别人看来却毫无违和感,这都来源于拥有扎实的异常捕获基本功。

⚡一、异常的定义

异常是一个事件,该事件在程序执行过程中发生,影响程序的正常执行。一般情况下,Python无法正常处理程序时就会发生一个异常。

例如我在代码中只写了一个变量a,运行程序,pycharm无法识别这个变量,所以报错,便是出现了异常。


🙊二、异常的处理

所以我们需要掌握处理异常的方法,处理异常的方法有很多种,接下来我们一个个来看。

1.try-except

它能够将可能出错的代码进行处理,处理后报错的红色字体将会转换成简短的、正常的字体,用法如下:

try:
    有可能出现异常的代码
except 异常类型 as 变量
	处理后的代码

举例:直接打印变量a会报错。

经过tyr-except处理过一下:

try:
    print(a)
except NameError as s:
    print(s)

再次运行看效果:

飘红的报错信息变得简短且颜色正常,看起来这个异常是不是显得舒服多了?

这里的tyr-except并不影响代码的运行,如果你的代码没有报错,你就算是写了tyr-except,它也只会执行try那行代码,那行代码没有错误,那就不会执行except里面的代码。

例如我们来一个正常的:

2.try-except-except

这种方法和前面的try-except写法是差不多的,只是后面再增加了一个except,可用于判断多种可能报错的情况。

例如:有两行代码可能会报错,两种不同类型的异常,但不想让它飘红。

try:
    1 / 0
    print(a)
except NameError as s:  # 第一种写法,用as+变量
    print(s)
except ZeroDivisionError:  # 第二种写法,自定义输出内容
    print("除数不能为0")  # 自定义输出的内容

运行结果:

虽然报错,但没有飘红,这里注意一下except的两种写法。

try-except的写法很灵活的,我们同样可以用元组把可能报错的异常类型囊括进去,避免写多行except,例如:

3.try-except-else

如果没有异常,则执行else里面的代码,例如:

4.try-except-finally

不管代码是否有异常,最后都会执行finally里面的代码。例如:

5.顶层类Exception

except后面其实可以不加错误类型,因为系统会默认认为后面的错误是类型是Exception,这是1个顶层类,包含了所有的出错类型。

🙈三、自定义异常

有没有发现,前面我们去做基本的异常捕获时,每次可能出错的地方就得写一个try-except,如果有多个地方可能会出错呢?是否我们需要写多个try-except?又或者理论上代码可以运行,但我想定一下规矩,凡是不符合我规矩的行为,我都让它出现异常,比如密码长度超出我规定的长度,我想让程序出现异常。

自定义异常可用于引发一个异常(抛出一个异常),由关键字raise引发。

举例:模拟用户输入密码的情景,用户输入的密码不能低于6位数,自定义一个异常,用于检测用户输入的密码是否符合规定,不符合则引发异常,提示当前输入的密码长度和最小密码长度不能低于6位数。

class MyError(Exception):  # 异常捕获的类
    def __init__(self, length, min_len):  # length为用户输入的密码长度,min_len为规定的最小长度
        self.length = length
        self.min_len = min_len

    # 设置抛出异常的描述信息
    def __str__(self):
        return "你输入的长度是%s,不能少于%s" % (self.length, self.min_len)

def main():
    try:
        con = input("请输入密码:")  # 获取用户输入的密码
        l = len(con)  # 获取用户输入的密码长度
        if l < 6:
            raise MyError(l, 6)  # 长度低于设定的6位数则引发异常
    except Exception as ss:  # 有错误则提示
        print(ss)
    else:
        print("您的密码输入完毕")  # 没有错误则执行

main()

运行结果:

从上面的代码中我们又用到了之前面向对象板块里面的类和实例对象的知识,忘记的赶紧去复习吧,除此之外,这里还结合了前面的try-except,还有我们的关键字raise引起异常捕获。

💤结语

以上就是基本的异常捕获和处理的方法,可以结合更多所学知识对异常进行更灵活的捕获和优化,现在基本上很少能看到代码异常报错但却原封不动地呈现给用户看的产品,说明大家对异常的处理还是很重视的,所以这一块知识对于开发者来说也是必备的。

到此这篇关于Python保姆式手把手带你掌握异常的捕获和处理的文章就介绍到这了,更多相关Python 异常的捕获和处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中的异常类型及处理方式示例详解

    目录 前言 正文 一.什么是异常 二.异常的类型 三.异常处理 四.try 介绍 五.finally 介绍 六.raise 介绍 结尾 前言 Python 是一种面向对象的.解释型的.通用的.开源的脚本编程语言.现在市面上 Python 非常的流行,主要是因为它简单易用,学习成本低,比如要实现某个功能,Python 可能只需要几行代码,而用C语言可能需要上百行代码,因为C语言什么都要得从头开始编码,而 Python 已经内置了很多功能模块,所以,我们只需要导入特定的包,就可以实现想要的效果. 正

  • 分析解决Python中sqlalchemy数据库连接池QueuePool异常

    目录 数据库相关错误的解决办法 错误一:数据库连接池超过限制 错误二:数据库事务未回滚 数据库相关错误的解决办法 错误一:数据库连接池超过限制 SqlAlchemy QueuePool limit overflow 造成连接数超过数据库连接池的限制,有两方面的原因,第一个是由于数据库连接池数比较小,因此当连接数稍微增加的时候就会超过限制,另一个原因就是在使用完数据库连接后未能即使释放,最后造成数据连接数持续增加从而超出数据库连接池的限制,所以我们也可以从这两个方面来解决这个问题,但是根本上还是得

  • 常见的Python异常及处理方法总结

    目录 一.错误与异常 1.什么是错误 2.什么是异常 3.回溯信息 二.常见异常 常见异常类 三.异常处理 1.异常处理 2.简单的异常处理格式 3.执行顺序 4.except分支可以有多个 5.执行顺序 6.else子句:没有发生异常时执行 7.finally子句:不管异常有没有发生都执行 8.异常嵌套 9.异常处理注意事项与建议 10.在函数中,需要注意在try/except/finally使用return 11.关于性能 四.课后小练习 总结 一.错误与异常 1.什么是错误 (1)语法错误

  • python之pyinstaller组件打包命令和异常解析实战

    项目场景: Python版本:3.8 因公司业务需求,须开发一套局域网内视频会议软件,此次采用Python实现此功能. 程序编写完并在编译器实现此功能后,采用pyinstaller组件打包成应用程序 问题描述: 在使用pyinstaller组件打包过程中,着实遇到一些问题,以下列出此次遇到主要的问题: 1.如何打包多个文件? 2.打包完运行后控制台显示"找不到指定模块.mkl_intel_thread.l.dll",图示如下: 3.打包如何排除不需要的组件以减少包的大小? 4.待补充

  • 手把手带你用python爬取小姐姐私房照

    目录 如何用Python搞到小姐姐私房照 目标站点 开发环境 效果预览 正式教程 一.第三方库安装 二.爬虫的基本套路 分析目标站点 请求网站获取数据 解析数据 保存数据 写在最后 如何用Python搞到小姐姐私房照 本文纯技术角度出发,教你如何用Python爬虫获取百度图库海量照片--技术无罪. 学会获取小姐姐私房照同理可得也能获取其他的照片,技术原理是一致的. 目标站点 百度图片使用关键字搜索 小姐姐私房照 https://image.baidu.com/ 开发环境 系统:Windows10

  • Python正则表达式保姆式教学详细教程

    目录 一.re模块 1.导入re模块 2.findall()的语法: 二.正则表达式 1.普通字符 2.元字符 (二)正则的使用 1.编译正则 2.正则对象的使用方法 3.Match object 的操作方法 4.re模块的函数 正则作为处理字符串的一个实用工具,在Python中经常会用到,比如爬虫爬取数据时常用正则来检索字符串等等.正则表达式已经内嵌在Python中,通过导入re模块就可以使用,作为刚学Python的新手大多数都听说"正则"这个术语. 今天来给大家分享一份关于比较详细

  • 手把手带你用Python实现一个计时器

    目录 Python 计时器 Python 定时器函数 示例 第一个 Python 计时器 一个 Python 定时器类 理解 Python 中的类 创建 Python 计时器类 使用 Python 计时器类 增加更多的便利性和灵活性 Timer改进 总结 虽然许多数据工作者认为 Python 是一种有效的编程语言,但纯 Python 程序比C.Rust 和 Java 等编译语言中的对应程序运行得更慢,为了更好地监控和优化Python程序,云朵君将和大家一起学习如何使用 Python 计时器来监控

  • python使用pyqt写带界面工具的示例代码

    上篇介绍的使用python自带tkinter包,来写带界面的工具. 此篇介绍使用pyqt来开发测试工具. tkinter的好处是python官方自带,上手容易(但手写控件复杂),布局和摆放都不直观和容易,因为是像素坐标定位,需要花较长时间在界面开发上.pyqt是第三方gui开发工具,是目前公认的python上最好的客户端界面开发工具,因为控件是通过qt设计师的手动拖拽,调整颜色 字体 大小等样式也很简单,不需要去代码层面来写大量界面代码,真正的所见即所得. 学习pyqt需要安装这些文件,pyqt

  • python 实现Requests发送带cookies的请求

    一.缘 起 最近学习[悠悠课堂]的接口自动化教程,文中提到Requests发送带cookies请求的方法,笔者随之也将其用于手头实际项目中,大致如下 二.背 景 实际需求是监控平台侧下发消息有无异常,如有异常便触发报警推送邮件,项目中下发消息接口需要带cookies 三.说 明 脚本的工程名为ynJxhdSendMsg,大致结构如下图 sendMsg.py为主程序,函数checkMsg为在已发消息列表中查找已下发消息,函数sendMsg为发消息并根据结果返回对应的标识 sendAlertEmai

  • 手把手带你掌握SpringBoot RabbitMQ延迟队列

    目录 1. 简介 2. 安装插件 3. 实现延迟队列 3.1 引入所需依赖 3.2 application.yaml 3.3 RabbitConfig 3.4 Producer 3.5 Consumer 3.6 测试代码 3.7 启动测试 1. 简介 我们在上一篇博文中遗留了一个小问题,就是虽然TTL + DLX能实现延迟队列的功能,但是有两个问题. 首先业务场景为:比如海底捞预约,每个人预约的时间段不一致,有个可能一个小时后,有的可能三个小时等,当快到预约时间点需要给用户进行短信通知. 通过给

  • 学生视角手把手带你写Java 线程池改良版

    目录 Java手写线程池(第二代) 第二代线程池的优化 线程池构造器 线程池拒绝策略 execute方法 手写线程池源码 MyExecutorService MyRejectedExecutionException MyRejectedExecutionHandle 核心类MyThreadPoolExecutor 线程池测试类 Java手写线程池(第二代) 第二代线程池的优化 1:新增了4种拒绝策略.分别为:MyAbortPolicy.MyDiscardPolicy.MyDiscardOldes

  • 解决Python 遍历字典时删除元素报异常的问题

    错误的代码① d = {'a':1, 'b':0, 'c':1, 'd':0} for key, val in d.items(): del(d[k]) 错误的代码② -- 对于Python3 d = {'a':1, 'b':0, 'c':1, 'd':0} for key, val in d.keys(): del(d[k]) 正确的代码 d = {'a':1, 'b':0, 'c':1, 'd':0} keys = list(d.keys()) for key, val in keys: d

  • Python 解决中文写入Excel时抛异常的问题

    近期接到业务部门需求,需将统计结果每日发送到业务部门,在调试python脚本的时候,导出的Excel标题为中文,总是抛出以下异常 Traceback (most recent call last): File "totalpx.py", line 99, in <module> export() File "totalpx.py", line 54, in export workbook.save(out_path) File "/usr/li

随机推荐