异常

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()   #报错!因为子类未实现sleep方法