第十六天学Python:异常处理
怎么能突然就停更呢/doge,就算为了加更三天跑车系列,这个Python系列也不能停对不对/doge,废话少说,直入主题:
——————————————
前言
任何人都是从初学者过来的,任何人在写程序或调试程序的时候都经历过异常报错的情况:变量错误、语法错误、逻辑错误、操作错误等等等等。这些异常都是不可避免的。
所以,针对程序异常产生的种种问题,Python语言提供了一个完整的异常处理机制:当程序运行发生异常后,我们用特定的语句可以捕捉异常,并对其作出相应的处理:
基本异常捕捉语句:
try…except…
- try关键字:象征着异常捕捉语句的开始,一般在try:里写上我们希望正常执行的代码
- except:用于捕捉异常,并执行异常发生时应该执行的程序
try:
主程序
except:________
异常处理程序
如果,在except:后面什么都不加的话,默认是发生任何异常的时候就执行异常处理程序,如:
>>> def out(num):
try:
num = num*0.5
return num
except:
print('输入错误!')
>>> out(1)
0.5
>>> out([1,2,3])
输入错误!
但是这种写法只能适用于基本的任务——因为我们不知道发生了什么异常。所以,为了保证程序的严谨与科学性,我们往往需要在expect 后面加上指定的异常信息
指定异常
常见的异常有以下几个:
异常 | 解释 |
---|---|
AttributeError | 对象属性、方法等不正确或不存在 |
IndexError | 元组/列表/字符串指定下标的元素不存在 |
IndentationError | 缩进错误 |
KeyError | 指定键不存在 |
NameError | 指定名不存在 |
TabError | TAB和空格混用 |
TypeError | 输入对象类型错误 |
ValueError | 输入对象值不正确 |
那么我们在用try…except语句时,就可以在except:后面加上指定的异常,对其进行特殊处理
例如:
>>> def out(num):
try:
num = num*0.5
return num
except TypeError:
print('输入类型错误!')
>>> out(1)
0.5
>>> out([1,2,3])
输入类型错误!
或者我们可以在except后面接上多种错误类型:(仅举例用)
except (TypeError,AttributeError):
finally
finally语句往往写在except的后面:
>>> def out(num):
try:
num = num*0.5
return num
except TypeError:
print('输入类型错误!')
finally :
print('over')
finally语句的特点就是 无论是否发生异常,程序都将执行finally的内容
这种语句在什么时候可以用上呢?
比如:
一个软件安装程序,在运行后如果发现没有找到要安装的文件,则会报错,然后自己退出程序;当它找到要安装的文件后,安装完后,同样自动退出程序。
主动触发异常:raise
使用raise +异常名可以主动触发相应的异常
def out(num):
if num < 0:
raise ValueError('值小于0')
num = num*0.5
return num
print(out(6))
print(out(-1))
输出如图:
自定义异常:继承
首先我们要知道的是:Python的其他异常都是由“BaseException”这一个类继承来的,即BaseException是一个基类。
当现有异常不能满足我们的时候,我们可以自定义一个新的异常供我们使用。已有异常的名字都是xxxError,所以我们在自定义异常的时候,也应该以Error结尾,并且在继承的时候,要继承BaseException
class MyError(BaseException):
def __init__ (self,K):
self.A = K
def out(num):
if num == 6:
raise MyError('值不能是6!')
num = num*0.5
return num
print(out(6))
我们再看结果:
————————————————————————
今天就说这些吧,原本是想先说Python自带标准库的,但是今天时间太晚了,还有别的任务没有完成,就临时调整了一下:)这个系列已经到了第十六期了,以后的日子会越来越难的2333333,基础内容即将完结,再过几期可能就会开始增加难度了。
然鹅一切都是那么的巧合,刚才我算了下日子,再不开学的话估计是要做线上的测试,而本学期的第一个考试周即将来临,下一个考试周更是恰好又和web应用的部分基本重合,这就是缘分吗:)到了那时候我本人还是要以考试为重的,也许会停更一小段时间,毕竟要是挂了科就得不偿失了:_(
我是康.,希望能做一个帮助到各位的博主,在更新完Python系列后,根据时间安排会再开机器学习系列或者算法系列,欢迎感兴趣的小伙伴与我共同学习,一起进步!下期见!