Python-异常错误
异常:逻辑和语法正常,程序运行时出现的未知错误,可以修复
常见的系统异常
# 除零异常
# 1/0
# ZeroDivisionError: division by zero
# 名称异常
# print(name)
# NameError: name 'name' is not defined
# 类型异常
# "1"+2
# TypeError: can only concatenate str (not "int") to str
# 索引异常
# l=[1, 2]
# l[3]
# IndexError: list index out of range
# 键异常
# dic = {"name":"sz", "age":18}
# dic["add"]
# KeyError: 'add'
# 属性异常
# name = "sz"
# print(name.xx)
# AttributeError: 'str' object has no attribute 'xx'
# 迭代器异常
# it = iter([1,2])
# print(next(it))
# print(next(it))
# print(next(it))
# # StopIteration
# # 1
# # 2
# 系统异常继承树
# baseException所有内建的异常的基类
# SystemExit 由sys.exit()函数引发,当它不处理时,Python解释器退出
# KeyboardInterrupt 当用户点击中断键(通常ctrl + C)时引发
# GeneratorExit 当调用一种generateor的close()方法时引发
# Exception 所有内置的、非系统退出异常是从该类派生出的,应该从该类派生出所有用户定义的异常
如何解决异常
系统一开始已经内置了一些特定的应用场景,当我们写代码的过程种,一旦触发了这个场景,系统内部就会自动的向外界抛出这个问题,即异常。程序被终止,软件崩溃。
预防
添加容错代码
弊端:容错代码不是主要业务逻辑,过多的话会造成代码混乱,主业务不清晰
解决
捕获处理异常
# -------------方案1---------------------
# try:
# 1 / 0
# print(name)
# except ZeroDivisionError as ze:
# print("xxx", ze)
# except NameError as ne:
# print("名称错误", ne)
# else:
# print("123")
# finally:
# print("最后执行的内容,不管是否出现异常,都会执行")
# 可以合并错误
# try:
# 1 / 0
# print(name)
# except (ZeroDivisionError, NameError) as e:
# print("xxx", e)
# else:
# print("123")
# finally:
# print("最后执行的内容,不管是否出现异常,都会执行")
# # xxx division by zero
# 不知道什么错误直接except Exception
如何手动抛出异常?
通过raise
语句直接向外界抛出异常
def set_age(age):
if age <=0 or age>200:
raise ValueError("值错误")
else:
print("设置年龄为",age)
try:
set_age(-18)
except ValueError as e:
print("x", e)
class LessZero(Exception):
def __init__(self, msg, error_code):
self.msg = msg
self.ec = error_code
def __str__(self):
return self.msg + str(self.ec)
def set_age(age):
if age <=0 or age>200:
raise LessZero("小于零,错误",404)
else:
print("设置年龄为",age)
try:
set_age(-18)
except LessZero as e:
print("x", e)
# x 小于零,错误404