异常处理之try…except
在写python代码时,有时可能会因某些原因使代码出错——具体原因具体分析,我们有时候需要知道报错的原因才能更加方便的去改正错误。
下边举例说明python中的错误
1.语法错误
# 例1
if 2>1
print(2222)
# 例2
dic = {"name";"alex"}
tu = (2,3,4''6)
# 错误提示:SyntaxError: invalid syntax
2.逻辑错误
dic = {"name":"海狗","age":18}
dic["hobby"]
# 错误提示:KeyError: 'hobby'
常用的是if进行异常判断,但是下边将以try进行举例:
单分支:
try:
num = int(input(">>>")) #出现value错误之后,直接跳转except语句
print(111)
except ValueError:
print(666)
# >>>a
# 666
try:
dic = {"name":"嘉欣"}
print(dic["age"])
num = int(input(">>>")) # 出现value错误之后,直接跳转except语句
print(111)
except ValueError:
print(666)
# KeyError: 'age'
try:
dic = {"name":"嘉欣"}
print(dic["age"])
num = int(input(">>>")) # 出现value错误之后,直接跳转except语句
print(111)
except KeyError:
print(666)
# 666
多分支:
try:
num = int(input(">>>")) # 出现value错误之后,直接跳转except语句
dic = {"name": "嘉欣"}
#print(dic["age"])
l1 = [1,2]
print(l1[100])
except ValueError:
print("输入的有非数字元素")
except KeyError:
print("没有此键")
except IndexError:
print("没有此下标")
print(666)
# >>>1233
# 没有此键
# 666
# >>>asd
# 输入的有非数字元素
# 666
# >>>123
# 没有此下标
# 666
万能一异常:
try:
dic = {"name": "嘉欣"}
# print(dic["age"])
l1 = [1,2]
print(l1[100])
print(111)
for i in 123:
pass
except Exception as e: # Exception 会将错误报出来
print(e)
# 'age'
# list index out of range
# 'int' object is not iterable
什么时候用万能? 什么时候用多分支?
如果你对错误信息不关心,只是想要排除错误让程序继续运行,用万能异常
但一般写代码…也不要每段都加try…那不是自寻烦恼吗
多分支加万能
def func():
pass
def func1():
pass
dic = {
1:func,
2:func1,
}
try:
num= int(input("请输入序号"))
dic[num]()
except ValueError:
print("请输入数字")
except KeyError:
print("请输入范围内的序号")
except Exception:
print("程序出现意料之外的错误....")
# 请输入序号456
# 请输入范围内的序号
# 请输入序号asfd
# 请输入数字
# 请输入序号1
try else finally 结构:
try:
dic = {"name": "嘉欣"}
#print(dic["age"])
l1 = [1,2]
# print(l1[100])
print(111)
except ValueError:
print("输入的有非数字元素")
except KeyError:
print("没有此键")
else:
print("如果没有出现异常则执行这里")
finally:
print("finally 666")
# 没有此键
# finally 666
# finally 666
# IndexError: list index out of range
# 111
# 如果没有出现异常则执行这里
# finally 666
# 如果将except都注释掉
try:
dic = {"name": "嘉欣"}
# print(dic["age"])
l1 = [1,2]
# print(l1[100])
print(111)
# except ValueError:
# print("输入的有非数字元素")
# except KeyError:
# print("没有此键")
# else:
# print("如果没有出现异常则执行这里")
finally:
print("finally 666")
# 111
# finally 666
except必须依赖于try else必须依赖于except和try
finally只是依赖于try
finally:在异常出现之前,执行finally
finally用在关闭数据库连接,文件句柄关闭,数据保存等,用到finally
with open("teat1",encoding="utf-8",mode="a+") as f1:
try:
for i in f1:
print(i)
if ....:
finally:
f1.close()
# SyntaxError: invalid syntax
def func():
try:
print(111)
return 666
finally:
print(22)
print(func())
# 111
# 22
# 666
在return结束函数之前,执行finally代码
while 1:
try:
print(1)
break
finally:
print(222)
# 1
# 222
在break之前,执行finally代码
主动触发异常:
raise ValueError("出现了value错误")
# ValueError: 出现了value错误
断言:展现出一种强硬的态度
name = "1"
n1 = input("请输入:")
assert name == n1
print(111)
print(222)
# 请输入:as
# AssertionError
#请输入:1
# 111
# 222
自定义异常:
python中给你提供的错误类型很多,但不是全部的错误,有些错误需要你自定义
class LiYeError(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise LiYeError('类型错误')
except LiYeError as e:
print(e)
# 类型错误
以上,希望能给你带来帮助~