【python基础】异常
概念
程序运行过程中,代码遇到错误,给出的错误提示。
异常的组成
异常的类型 : 错误信息
捕获异常
try:
可能出现异常的代码
except 异常的类型:
发生异常执行的代码
示例:
array = [1, 2]
for i in range(4):
try:
array[i] = i
except IndexError:
print(f'越界访问,index({i})')
print(f'已经执行{i}')
''''
已经执行0
已经执行1
越界访问,index(2)
已经执行2
越界访问,index(3)
已经执行3
''''
捕获多个异常
try:
可能出现的异常
except (异常类型1,异常类型2,...):
发生异常执行的代码
try:
可能发生的异常代码
except 异常类型1:
执行的代码
except 异常类型2:
执行的代码
except 异常类型3:
执行的代码
打印异常信息
try:
可能出现的异常
except (异常类型1,异常类型2,...) as 变量名:
发生异常执行的代码
print(变量名)
array = [1, 2]
for i in range(3):
try:
array[i] = i
except IndexError as err:
print(f'越界访问,index({i})')
print(err)
'''
越界访问,index(2)
list assignment index out of range
'''
捕获所有异常
try:
可能发生异常的代码
except: # 缺点:不能获取异常描述信息
发生异常执行的代码
================================
try:
可能发生异常的代码
except Exception as e: # 可以打印错误信息
发生异常执行的代码
'''
Exception 是常见异常的父类
'''
异常的完整结结构
try:
可能发生异常的代码
except Exception as e: # 可以打印错误信息
发生异常执行的代码
else:
代码没有发生异常,会执行
finally:
不管是否发生异常,都会执行
array = [1, 2]
for i in range(3):
try:
array[i] = i
except IndexError as err:
print(err)
else:
print('没有发生异常,会执行')
finally:
print('不管是否发生异常,都会执行')
print('-'*30)
'''
没有发生异常,会执行
不管是否发生异常,都会执行
------------------------------
没有发生异常,会执行
不管是否发生异常,都会执行
------------------------------
list assignment index out of range
不管是否发生异常,都会执行
------------------------------
'''
异常的传递
是python异常处理的底层原理。
异常传递:当一行代码发生异常的时候,会向外层这个异常进行传递,直到被捕获或者程序报错为止。
array = [1, 2]
for i in range(3):
try:
try:
array[i] = i
finally:
print('内层 finally')
print('-'*30)
except Exception as e:
print(e)
print('外层捕获')
finally:
print('外层 finally')
'''
内层 finally
------------------------------
外层 finally
内层 finally
------------------------------
外层 finally
内层 finally
------------------------------
list assignment index out of range
外层捕获
外层 finally
'''
抛出自定义异常
程序代码为什么会报错?
因为不符语法,python的作者在代码中是用来if判断,如果除数为0,就会在代码中抛出异常。
抛出异常:
raise 异常对象 # 带代码遇见 raise的时候,程序就报错了。
异常对象 = 异常类(参数)
抛出自定义异常:
1.自定义异常类,继承Exception 异常或者 BaseException
2.选择书写,定义__init__ 方法 定义__str__方法
3.在合适的时机抛出异常即可
示例:
定义密码长度异常类,低于6位抛异常
class PasswdLengthError(Exception):
pass
# 继承了父类的__init__ __str__方法
def getpasswd():
passwd = input('输入密码')
if len(passwd) >= 6:
print('合格')
else:
# 抛出异常
raise PasswdLengthError('密码长度不足6位') # 引发抛异常,因为未捕获会会报错
getpasswd() # 调用函数
'''
raise PasswdLengthError('密码长度不足6位')
__main__.PasswdLengthError: 密码长度不足6位
'''
修稿:
try:
getpasswd()
except PasswdLengthError as e:
print(e) # 异常类的__str__方法
'''
输入密码qwe
密码长度不足6位
'''