代码出现异常而报错再正常不过了,但为什么要处理异常?
由于异常的存在,代码运行时会出现一大堆的红色字体提示,对于程序员还好,见红色报错见多了习惯了,但如果你开发出来的东西要给别人看,那么不懂代码的人就会一脸懵逼,对产品的印象都不太好了。
比如我们经常简单网页丢失的情况,其实是就是网页代码执行时发生了异常,但有的网页还是很个性的,提示的信息可能是比较人性化的,比如CSDN你收藏的文章被后台删除了,导致直接跳到这个界面的代码无法执行,此时的报错信息是这样的:
但有些产品在开发时想得并不是那么周到,没有体会用户端的感受,结果某个程序出错了,用户能看到一堆报错代码,好感度直线下降。
首先这篇文章所讲的异常不是指教你如何让代码不报错,代码异常出错得进行调试来解决,这不是我们这里的重点,今天的重点是在代码可能报错的地方进行优化和个性化,让错误看起来也比较和谐。
其次这也是Python新手入门教程系列文章的一个重要板块,可以给以后的开发奠定良好的异常处理基础,代码总会有异常,但有的异常在别人看来却毫无违和感,这都来源于拥有扎实的异常捕获基本功。
异常是一个事件,该事件在程序执行过程中发生,影响程序的正常执行。一般情况下,Python无法正常处理程序时就会发生一个异常。
例如我在代码中只写了一个变量a,运行程序,pycharm无法识别这个变量,所以报错,便是出现了异常。
所以我们需要掌握处理异常的方法,处理异常的方法有很多种,接下来我们一个个来看。
它能够将可能出错的代码进行处理,处理后报错的红色字体将会转换成简短的、正常的字体,用法如下:
try: 有可能出现异常的代码except 异常类型 as 变量 处理后的代码
举例:直接打印变量a会报错。
经过tyr-except处理过一下:
try: print(a)except NameError as s: print(s)
再次运行看效果:
飘红的报错信息变得简短且颜色正常,看起来这个异常是不是显得舒服多了?
这里的tyr-except并不影响代码的运行,如果你的代码没有报错,你就算是写了tyr-except,它也只会执行try那行代码,那行代码没有错误,那就不会执行except里面的代码。
例如我们来一个正常的:
这种方法和前面的try-except写法是差不多的,只是后面再增加了一个except,可用于判断多种可能报错的情况。
例如:有两行代码可能会报错,两种不同类型的异常,但不想让它飘红。
try: 1 / 0 print(a)except NameError as s: # 第一种写法,用as+变量 print(s)except ZeroDivisionError: # 第二种写法,自定义输出内容 print("除数不能为0") # 自定义输出的内容
运行结果:
虽然报错,但没有飘红,这里注意一下except的两种写法。
try-except的写法很灵活的,我们同样可以用元组把可能报错的异常类型囊括进去,避免写多行except,例如:
如果没有异常,则执行else里面的代码,例如:
不管代码是否有异常,最后都会执行finally里面的代码。例如:
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引起异常捕获。
以上就是基本的异常捕获和处理的方法,可以结合更多所学知识对异常进行更灵活的捕获和优化,现在基本上很少能看到代码异常报错但却原封不动地呈现给用户看的产品,说明大家对异常的处理还是很重视的,所以这一块知识对于开发者来说也是必备的。
我的公众号在一番筹备之后终于出来了,公众号会有我所有的技术和经验文章,因为每个平台支持的文章类型不一样,所以有些文章大家可能是没有见过的,欢迎前去查阅。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121130.html
前言 最近,我在群里答疑的时候,经常碰到,小伙伴,再变量,缩进,参数,方面使用错误,导致程序运行不来。 今天,打算自己写一篇。 Python 变量作用域,和生命周期。 彻底弄懂变量该怎么使用。 知识点 变量的使用,有作用域区别,也有生命周期的区别。 1.变量作用域 局部变量 python能够影响变量作用域的代码段是def、class、lamda。 def scopeTest(): local...
?前言 在Python写代码做项目时,我们往往需要对多个文件进行操作,在现在的源代码文件中怎么导入其他文件?怎么对其他文件进行操作?这都是经常要面临的问题,尤其是爬虫,爬到的数据放在哪里?用到的时候怎么调出来? 这就涉及到了Python的文件操作知识了,我们不可能永远都只会在一个源文件上做所有的操作,这也是必须掌握的一个知识板块。 与此同时,我的Python新手入门教程系列文章也已经快更新完了,欢...
摘要:前言在开发技术和应用市场完全成熟的今天,有人希望深耕技术打造出自己的一片天地,也有人想广泛学习在程序员市场中游刃有余。而这本书上千的引用论文,给我指明了一条系统学习理论的明路。 ...
摘要:文章目录情景再现本文关键词挑个软柿子单页爬取数据处理翻页操作撸代码主调度函数页面抓取函数解析保存函数可视化颜色分布评价词云图源码获取方式情景再现今日天气尚好,女友忽然欲买文胸,但不知何色更美,遂命吾剖析何色买者益众,为点议,事后而奖励之。 ...
摘要:耗时代码运行到这句之后触发隐式等待,在轮询检查后仍然没有定位到元素,抛出异常。耗时值得一提的是,对于定位不到元素的时候,从耗时方面隐式等待和强制等待没什么区别。 ...
阅读 2281·2021-09-30 09:47
阅读 2209·2021-09-26 09:55
阅读 2936·2021-09-24 10:27
阅读 1532·2019-08-27 10:54
阅读 959·2019-08-26 13:40
阅读 2485·2019-08-26 13:24
阅读 2409·2019-08-26 13:22
阅读 1719·2019-08-23 18:38