定义
程序执行的过程中,出现的错误称为异常
异常的捕获
将异常出现的错误,改为正常执行
注意
- 异常具有传递性,在调用异常出现的所有函数中,都会报错
- 异常的处理可以在异常传递的任意位置,最好处理异常的位置是最上层或者最下层,一般情况不在中间层处理,最上层进行捕获,定义一个异常类
常见异常
– 名称异常(NameError):变量未定义。
– 类型异常(TypeError):不同类型数据进行运算。
– 索引异常(IndexError):超出索引范围。
– 属性异常(AttributeError):对象没有对应名称的属性。
– 键异常(KeyError):没有对应名称的键。
– 未实现异常(NotImplementedError):尚未实现的方法。
raise NotlmplementedError
– 异常基类Exception。
异常处理
流程
try:
可能触发异常的语句
except 错误类型1 [as 变量1]:
处理语句1
except 错误类型2 [as 变量2]:
处理语句2
except Exception [as 变量3]:
不是以上错误类型的处理语句
else:
未发生异常的语句
finally:
无论是否发生异常的语句
自定义异常
1. 自定义异常的类的基类必须是Exception
2. 在__init__方法中必须添加super().__init__()
示例代码:
def apple(person_num):
if isinstance(person_num, float):
raise SelfFloatError(person_num)
num = 100 // person_num
num1 = 100 % person_num
return num, num1
class SelfFloatError(Exception):
def __init__(self, num):
super().__init__()
self.data = "参数不能是浮点性数据%f" % (num)
def __str__(self):
return self.data
class ErrorException(object):
def __init__(self, function, *args):
self.function = function
self.args = args
self.type = None
self.error_str = None
self.res = None
def try_function(self):
try:
self.res = self.function(*self.args)
except NameError as e:
self.type = 1
self.error_str = e
except TypeError as e:
self.type = 2
self.error_str = e
except ZeroDivisionError as e:
self.type = 3
self.error_str = e
except SelfFloatError as e:
self.type = 5
self.error_str = e
except Exception as e:
self.type = 4
self.error_str = e
else:
self.type = 0
self.error_str = 'Success'
finally:
return self.type, self.error_str, self.res
if __name__ == '__main__':
e = ErrorException(apple, 3.141592653)
res = e.try_function()
del e
print(res)
print(res[1].data)
运行结果:
(5, SelfFloatError(), None)
参数不能是浮点性数据3.141593
使用场景
- 逻辑的角度来说: 程序执行存在问题
- 设计的角度来说: 多层函数的返回
示例代码:
class SelfError1(Exception):
def __init__(self, num):
super().__init__()
self.num = num
def a(n1, n2, n3, n4):
n = n1 + n2
return b(n1, n3, n4)
def b(n1, n2, n3):
n = n2 - n3
return c(n, n1)
def c(n1, n2):
raise SelfError1(n1 * n2)
try:
a(1, 2, 3, 4)
except SelfError1 as e:
print(e.num)
运行结果:
-1