13.3 自定义异常
13.3.1 finally 关键字
finally:必须要执行的代码(释放资源、释放内存)
不论try中写文件的过程中是否有异常,finally中关闭文件的操作一定会执行。由于finally的这个特性,finally经常被用来做一些清理工作。
try:int(input("请你输入一个数字:"))
except Exception as e:
print("出现异常") else:
print("没有出现异常")
finally:
print("无论有没有异常,都会打印")
print("剩余的代码")
def demo(msg):
try:
int(input(msg))
print("hello world")
return "A"
except Exception as e:
print("处理异常")
return "B"
finally:
print("释放资源")
return "C"
res = demo(input(">>>>>:"))
print(res)
#控制台输入123 会打印出什么?
函数中,如果return后面存在finally,那么代码并不会直接返回,而是需要执行finally,再执行返回,所以finally会在return前执行
实际应用中,不推荐在finally中使用return返回
13.3.2 自定义异常
需要创建一个类,需要继承异常的父类(BaseException Exception)
在自定义异常类中,重写父类init方法
raise 语句可以自定义报错信息,raise后的语句是不会被执行了,因为已经抛出异常,控制流将会跳到异常捕捉模块
except 语句可以一个except后带多个异常,也可以用多个语句捕捉多个异常,分别做不同处理
except语句捕捉的异常如果没有发生,那么except里的语句块是不被执行的。而是执行else里的语句
class MyException(Exception):
def __init__(self,msg):
Exception.__init__(self,msg)
def login(username,password):
if username == None or username.strip() == "":
#raise关键字 抛出异常
raise MyException("对不起,用户名不能为空")
if password == None or password.strip() == "":
raise MyException("对不起,密码不能为空")
if __name__ == '__main__':
# login(None,None) try:
login("张三", None)
except Exception as e:
print("抓捕异常,异常是:",e)