异常处理
1. 异常处理的介绍
所谓“异常”,其实就是程序在运行过程中,由于某些逻辑问题而出现的不正常的情况。异常的出现会终止程序的运行。
例如:在使用int()将其他的数据类型转成整型的时候,如果我们要转的是一个非数字的字符串,可能就会出现这个问题。
int(“abc”)
常见的异常:
- ValueError
- TypeError
- NameError
- IndexError
- KeyError
- ZeroDivisionError
- 等
而“异常处理”就是我们将可能出现异常的代码,使用try代码块包含,使用except列出可能出现的异常进行捕获,为这种异常情况设置一个预备方案,以保证程序可以正常运行,不会中断。
2. 异常处理的语法
异常处理的流程:
- 解释器逐行执行代码
- 如果发现错误,解析错误类型,生成一个对应的异常对象,将异常抛出
- 检查周围有没有处理这种类型的代码块
- 如果周围有处理这种类型异常的代码块,执行对应的程序逻辑
- 如果周围没有处理这种类型异常的代码块,中断程序
2.1. try-except
try:
# 让用户在控制台输入数字,输入的可能不正确
number = int(input("please input a number: "))
except ValueError as v:
print("输入的不是数字!")
2.2. else
else用在try结构的后面,在try的代码段中没有异常出现的时候会执行
try:
# 让用户在控制台输入数字,输入的可能不正确
number = int(input("please input a number: "))
except ValueError as v:
print("输入的不是数字!")
else:
print("用户的输入没有问题")
2.3. finally
finally用在try结构的后面,无论try的代码段中有没有出现异常,finally代码段中的代码始终都会执行
try:
# 让用户在控制台输入数字,输入的可能不正确
number = int(input("please input a number: "))
except ValueError as v:
print("输入的不是数字!")
finally:
print("finally")
3. 异常抛出
3.1. 抛出系统异常
我们在设计某些函数的时候,有时候需要对外界传入的数据进行逻辑上的判断,对于判断结果不成立的数据,我们可以适当的抛出异常,让调用方必须要处理这样的问题,才能够继续使用这些功能。起到一个约束的作用。
抛出异常,其实就是实例化一个异常类的对象,然后使用raise关键字抛出,使其生效。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if 1 <= age <= 150:
self.__age = age
else:
raise ValueError("年龄异常")
p = Person(19, 200)
3.2. 自定义异常
系统给我们提供了很多的异常类,但是这些异常类并不能够满足我们所有的需求。对于有些功能,在实现的时候我们希望能够对数据进行逻辑处理,处理结果不正确的,及时抛出异常,让调用方去处理。调用方在处理的时候,需要使用指定的异常类型来捕获。可是如果都是用到系统的异常类型的话,那么语义表达上面会有问题。因此
自定义异常类,只需要设计一个类去继承Exception类即可。
# 自定义异常类
class AgeError(Exception):
pass
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if 1 <= age <= 150:
self.__age = age
else:
# 抛出自定义的异常
raise AgeError("年龄异常")
try:
p = Person(19, 200)
except AgeError as a:
print("年龄有问题,需要重新实例化对象")