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

 更新时间:2021年09月27日 14:42:12   作者:退休的龙叔  
异常即非正常状态,在Python中使用异常对象来表示异常。若程序在编译或运行过程中发生错误,程序的执行过程就会发生改变,抛出异常对象,程序流进入异常处理。如果异常对象没有被处理或捕捉,程序就会执行回溯(Traceback)来终止程序

👀前言

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

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

比如我们经常简单网页丢失的情况,其实是就是网页代码执行时发生了异常,但有的网页还是很个性的,提示的信息可能是比较人性化的,比如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 异常的捕获和处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • tensorflow 打印内存中的变量方法

    tensorflow 打印内存中的变量方法

    今天小编就为大家分享一篇tensorflow 打印内存中的变量方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python接口自动化浅析pymysql数据库操作流程

    Python接口自动化浅析pymysql数据库操作流程

    本文主要介绍pymysql安装、操作流程、语法基础及封装操作数据库类,需要的朋友可以参考下,希望能对大家有所帮助,每日提升一点点,欢迎大家多多交流讨论
    2021-08-08
  • Pycharm 解决自动格式化冲突的设置操作

    Pycharm 解决自动格式化冲突的设置操作

    这篇文章主要介绍了Pycharm 解决自动格式化冲突的设置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • 基于np.arange与np.linspace细微区别(数据溢出问题)

    基于np.arange与np.linspace细微区别(数据溢出问题)

    这篇文章主要介绍了基于np.arange与np.linspace细微区别(数据溢出问题),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Python反爬虫伪装浏览器进行爬虫

    Python反爬虫伪装浏览器进行爬虫

    这篇文章主要介绍了Python反爬虫伪装浏览器进行爬虫,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 用python处理图片之打开\显示\保存图像的方法

    用python处理图片之打开\显示\保存图像的方法

    本篇文章主要介绍了用python处理图片之打开\显示\保存图像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 利用Tensorboard绘制网络识别准确率和loss曲线实例

    利用Tensorboard绘制网络识别准确率和loss曲线实例

    今天小编就为大家分享一篇利用Tensorboard绘制网络识别准确率和loss曲线实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python语言描述连续子数组的最大和

    Python语言描述连续子数组的最大和

    这篇文章主要介绍了Python语言描述连续子数组的最大和,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python基于hashlib模块的文件MD5一致性加密验证示例

    Python基于hashlib模块的文件MD5一致性加密验证示例

    这篇文章主要介绍了Python基于hashlib模块的文件MD5一致性加密验证,涉及Python使用hashlib模块进行字符串与文件的MD5加密验证操作相关实现技巧,需要的朋友可以参考下
    2018-02-02
  • Pandas数据如何读取与导出

    Pandas数据如何读取与导出

    Pandas是一个强大的Python库,用于数据处理和分析,它提供了多种文件格式的数据读取和导出方法,包括CSV、Excel、SQL数据库、JSON等,常用的数据读取方法为`pd.read_csv()`、`pd.read_excel()`等,导出方法为`to_csv()`、`to_excel()`等
    2025-01-01

最新评论