异常
- 为了是程序更具健壮性,在程序中遇到的可能出现的错误都要尽量被解决。对可能出现错误的代码进行处理,就是异常处理。
- 一段代码,如果遇到异常,没有得到处理,则整个程序就会停止下来,如果进行处理,则程序往下运行。
简单的异常处理,try-except:
格式如:
try: # 尝试捕获异常的代码(可能会出错的代码) except: # 出现异常后要执行的代码
异常捕获的完整语法:
在实际开发中,一段代码可能会遇到不同的错误,则针对不同的错误有不同的处理方法,这时需要如下格式处理:
try: # 尝试捕获异常的代码(可能会出错的代码) except 错误类型1: # 出现错误类型1后要执行的代码 except (错误类型1,错误类型2): # 出现错误类型1和2后要执行的代码 except Exception as result: # 出现其它错误类型后要执行的代码(通常是告知未知错误)
else:
#没有异常才会执行的代码
pass
finally:
#无论是否有异常,都要执行的代码
异常的传递性
程序中,如果异常没有得到处理,则会向上传递,如果一直传递到主程序还没有得到处理,则程序终止,如:
1 # 异常会向上传递直到主程序 2 class A: 3 def demo1(self): 4 return int(input("请输入一个整数")) 5 def demo2(self): 6 return demo1() 7 8 a = A() 9 a.demo2()
运行结果,可以看到错误从第6行传递到调用它的第9行,仍没得到解决,于是报错:
E:python3python3.exe F:/PycharmProjects/project3-class/xh_23_异常传递.py
Traceback (most recent call last):
File "F:/PycharmProjects/project3-class/xh_23_异常传递.py", line 9, in <module>
a.demo2()
File "F:/PycharmProjects/project3-class/xh_23_异常传递.py", line 6, in demo2
return demo1()
NameError: name 'demo1' is not defined
利用异常的传递性,可以直接在主程序处理异常,而不用在各个方法中处理,减少代码的复杂性。
主动抛出异常
在开发中,有时我们需要主动抛出一些,符合程序运行,但不符合需求设定的异常。
抛出异常和捕获异常是两个不同的概念。抛出异常并不代表处理好异常了,它只是把异常抛出去了而已,还需要捕获处理。
例如:如果用户输入的密码少于8位,则提示异常,并进行处理。
思路:
- 创建一个Exception对象
- 使用raise关键字抛出该异常(该Exception对象)
格式:自定义异常名 = Exception(“提示字符串”) #括号中除了传递字符串,还可以传递其它参数,但是现在我还不知道能传啥
raise 自定义异常名 #主动抛出此异常
举个例子,输入一段字符串,如果字符串长度小于8则抛出异常:
def input_passwd(): a = input("请输入密码:") if len(a) > 8: return a yc = Exception("密码长度不够") #实例化一个异常对象起名yc,并初始化提示信息“密码长度不够” raise yc1 #主动抛出异常 input_passwd()
此时执行此程序,若输入一个长度小于8的字符串,则报错:
Traceback (most recent call last):
File "F:/PycharmProjects/project3-class/xh_24_主动抛出异常.py", line 7, in <module>
input_passwd()
File "F:/PycharmProjects/project3-class/xh_24_主动抛出异常.py", line 6, in input_passwd
raise yc1
Exception: 密码长度不够
主动抛出的异常同样需要对其进行处理,不然报错并终止程序。