❤️Python异常捕获和处理❤️保姆式教学,代码异常报错也能那么和谐且个性!

x33g5p2x  于2021-09-25 转载在 Python  
字(2.4k)|赞(0)|评价(0)|浏览(515)

👀前言

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

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

比如我们经常简单网页丢失的情况,其实是就是网页代码执行时发生了异常,但有的网页还是很个性的,提示的信息可能是比较人性化的,比如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引起异常捕获。

💤结语

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

相关文章