异常处理
异常处理:
错误分类: 1.语法错误:程序未执行之前python已经做了提示了,飘红状态.
例如: name , dic = { } dic["key"] 只写这些内容就会报错.
2.逻辑错误: 分为可预知的,和不可预知的.
见过的: num = int(input(">>>")) #ValueError
name #NameError
if 1>0; #SyntaxError
dic = {}
dic["key"] #KeyError
等等很多很多
什么是异常?
有错误引发的,而且出现异常就会终止程序.
为什么要进行异常处理:
1.异常就会终止程序,用户体验极差.
2.让编写的代码更简洁.
异常处理:
1. if 异常处理 它只能处理简单的逻辑.
num= input("<<<")
if num.isdigit():
num = int(num)
if 1 <= num <= 5:
....
else:
print("有非数字类型")
2.try.异常处理
遇到报错信息,防止程序终止,执行另一个语句.
2.1 单独一个条件.单独.
try:
num= int(input(">>>")) #ValueError
name #NameError
dic = {}
dic["key"] #KeyError
except NameError:
print("出现了NameError错误")
print(11111)
print(22222)
print(6666)
2.2 多分支
try:
num = int(input(">>>")) #ValueError
name #NameError
dic = {}
dic["key"]
except NameError:
print("出现了NameError错误")
except ValueError:
print("出现了ValueError错误")
except KeyError:
print("出现了KeyError错误")
print(2222)
print(4444)
print(6666)
class A:
def __str__(self):
return "list index out of range"
a = A()
print(a)
3.万能异常处理
try:
num = int(input(">>>")) #ValueError
name #NameError
dic = {}
dic['key'] # KeyError
except Exception as e:
print("你输入的不规范,请重新输入...)
异常处理的两种结局方式:
1.只是显示错误信息,不终止程序就行. 用万能的.
2.针对不同的错误,提示不同的信息,进行不同的操作. 用多分支 + 万能
def login():
pass
def regsiter():
pass
def article():
pass
def dariy():
pass
dic = {
1:login,
2:regsiter,
3:article,
4:dariy,
}
while True:
choice = input("请输入")
if choice.isdigit():
choice = int(choice)
if 1<= choice <=4:
dic[choice]()
else:
print("请输入范围内的数字")
else:
print("请输入数字...")
while True:
try:
choice = int(input("<<<<"))
dic[choice]()
except ValueError:
print("请输入数字...")
except KeyError:
print("请输入范围内的数字")
while True:
try:
choice = int(input("请选择"))
dic[choice]()
except: #这样写会报错,改成except Exception as e:这样就不会报错了
print("请输入数字")
except:
print("请输入范围内的数字")
4.多分支 + 万能
while True:
try:
choice = int(input('请输入:'))
dic[choice]()
except ValueError:
print('请输入数字...')
except Exception as e:
print(e)
except KeyError:
print('请范围内的数字...')
try:
choice = int(input('请输入:'))
except ValueError:
print('请输入数字...')
except KeyError:
print('请范围内的数字...')
except Exception as e:
print(e)
2.5 try except except ....else
如果程序出现异常执行except,就不会执行else,反之则执行else.
try:
print("我的卡扣除了100元")
#name
print("徐哥的卡增加了100元")
except NameError:
print("转账出现异常")
else:
print("转账成功")
2.6
try except except.... else .finally
try finally
try:
print("我的卡扣除了100元")
#name
print("旭哥的卡增加了100元")
except NameError:
print("转账出现异常...")
else:
print("转账成功")
finally:
print(666666)
try:
name
finally:
print(6666)
出现错误先执行finally语句,经常用于关闭文件句柄,关闭数据库的连接,关闭网络链接等等.
try:
f = open("t1",encoding = "utf-8")
print(f.read())
"""多个文件句柄的操作"""
f.write()
finally:
f.close()
print(666)
def func():
try:
return 555
finally:
"""代码块"""
print(666)
func()
try finally 出现错误先执行finally语句,经常应用于关闭文件句柄,关闭数据库,关闭网络连接等等.
2.7 主动触发异常
raise TypeError("类型错误")
class Payment:
def pay(self,money):
raise TypeError 3("类中应该用一个pay方法")
class QQ(Payment):
def pay(self,money):
print("你用qq支付了%s元"% money)
class Wechat(Payment):
def pay(self,money):
print("你用微信支付了%s元"%money)
def pay(obj,money):
obj.pay(money)
q = QQ()
w = Wechat()
pay(w,1000)
2.8 自定义异常(大项目,针对于python不具备的一些错误类型)
raise TypeError("类型错误")
name1 : python解释器没法解决的错误: nana
class nana(BaseException):
def __init__(self.msg):
self.msg = msg
def __str__(self):
return self.msg
try:
raise nana("出错了")
except nana as e: #e = nana("出错了")
print(e)
断言 源码 主动抛出异常
condition = 1 > 2
assert condition #如果条件不满足强行终止
print(1111)
print(22222)
print(6666)
"""
1,try ...except 单个情况
2,try except except..... 多分支,针对多个你已知的异常,分别导向不同的代码. *
3,try except Exception as e: 万能异常处理. 你对出现的异常错误未知,你要用万能的. *
# 1,只是显示错误信息,不终止程序就行. 万能的
# 2,针对不同的错误,提示不同的信息,进行不同的操作. 多分支,多分支+ 万能
4,try except except except Exception as e: 多分支 + 万能 *
5,try except except... else 出现异常就不执行else代码反之则执行.
6,
try except except... else,finally 不常用
try finally * 涉及到关闭文件句柄,网络链接,数据库链接等等.
7, raise
8, 自定义异常处理.
9 assert
"""