异常
1.定义:运行时检测到的错误。
2.现象:当异常发生时,程序不会再向下执行,而转到函数的调用语句。
3.
常见异常类型
:
– 名称异常(NameError):变量未定义。
– 类型异常(TypeError):不同类型数据进行运算。
– 索引异常(IndexError):超出索引范围。
– 属性异常(AttributeError):对象没有对应名称的属性。
– 键异常(KeyError):没有对应名称的键。
– 为实现异常(NotImplementedError):尚未实现的方法。
– 异常基类Exception。
用try语句捕获异常
1.语法:
try
:
可能触发异常的语句
except
错误类型
1
[
as
变量
1
]
:
处理语句
1
except
错误类型
2
[
as
变量
2
]
:
处理语句
2
except
Exception
[
as
变量
3
]
:
不是以上错误类型的处理语句(因为Exception 可接收所有异常)
else
:
未发生异常的语句
finally
:
无论是否发生异常的语句
2.作用:捕获异常并尝试处理异常使得程序能够正常的运行。
3.说明:
as 子句是用于绑定错误对象的变量,可以省略
except子句可以有一个或多个,用来捕获某种类型的错误。
else子句最多只能有一个。
finally子句最多只能有一个,如果没有except子句,必须存在。
4,异常的上报机制
异常通常是由调用者负责捕获的,如果异常没有被捕获到,会继续向更上层(调用处)继续传递,直到程序因异常无人处理而终止运行。
5,raise 语句
1.作用:抛出一个错误,让程序进入异常状态。
2.目的:在程序调用层数较深时,向主调函数传递错误信息要层层return 比较麻烦,所以人为抛出异常,可以直接向外传递错误信息。
6.自定义异常
1).定义:
class
类名Error
(
Exception
)
:
def
__init__
(
self
,
参数
)
:
super
(
)
.
__init__
(
参数
)
self
.
数据
=
参数
2).使用:
raise
自定义异常类名
(
参数
)
3)捕获自定义异常
try
:
…
.
pass
…
.
except
自定义定义异常类
as
变量名
:
pass
4).作用:封装自定义错误信息
例子:
"""
自定义异常
练习:成绩异常(1-100)
"""
class
AgeError
(
Exception
)
:
"""
封装错误信息
"""
def
__init__
(
self
,
msg
,
code
,
age_value
)
:
super
(
)
.
__init__
(
msg
)
self
.
msg
=
msg
self
.
code
=
code
self
.
age_value
=
age_value
class
Wife
:
def
__init__
(
self
,
age
)
:
self
.
age
=
age
@
property
def
age
(
self
)
:
return
self
.
__age
@age
.
setter
def
age
(
self
,
value
)
:
if
20
<=
value
<=
30
:
self
.
__age
=
value
else
:
# print("我不要")
# raise ValueError("我不要") # 人为抛出异常
raise
AgeError
(
"我不要"
,
27
,
value
)
try
:
w01
=
Wife
(
80
)
print
(
w01
.
age
)
except
AgeError
as
e
:
print
(
"错误信息:"
,
e
.
msg
)
print
(
"错误代码行号:"
,
e
.
code
)
print
(
"输入的年龄是:"
,
e
.
age_value
)
7,异常在OOP中的经典用途:
在某些情况下,父类中需要定义某些方法但并不实现它(因为好的OOP中父类是抽象的子类是具体的),让子类实例能够“.”出来以明示子类实例应该具有哪些方法,父类方法中使用
raise NotImplementedError
来强迫子类必须重写(点号)父类对象的这些方法。如果子类没有重写这些方法在调用这些方法时就会报错。
class
Animal
:
def
eat
(
self
)
:
raise
NotImplementedError
def
sleep
(
self
)
:
raise
NotImplementedError
class
Dog
(
Animal
)
:
pass
dog
=
Dog
(
)
dog
.
sleep
(
)
#报错!