异常处理
格式
当程序运行时,出现的一些问题(语法问题,逻辑问题等),程序则会抛出一个错误,程序终止。异常处理就是把可能出错的代码包围起来,让其抛出错误并接收错误,告诉计算机当程序产生错误时,你应该怎么做,而不会让程序终止。
try:
可能出错的代码
except [异常类型]:
出错后执行的代码
异常类型
TypeError :类型错误
ZeroDivisionError:除数不能为零
Exception:错误类型都继承于该类,即任意的错误都可以用他来接收
try:
可能出错的代码
except [异常1]:
出错后执行的代码
except [异常2]:
出错后执行的代码
except Exception as e: # 一般放在最后面,用来接收所有错误 输出 e[e可以为任何变量名] 即为错误的内容
出错后执行的代码
如果想要知道抛出的异常,是什么信息,则可以使用上面的方法
try:
可能出错的代码
except [异常1]:
出错后执行的代码
except [异常2]:
出错后执行的代码
else:
try里面的语句没有抛出异常,则会执行else里面语句
try:
可能出错的代码
except [异常1]:
出错后执行的代码
except [异常2]:
出错后执行的代码
else:
try里面的语句没有抛出异常,则会执行else里面语句
finally:
无论代码是否报错,代码一定会运行(必执行代码),就算提前有return也会延迟return,执行finally
如果代码中有返回值+finally,则肯定会执行finally里面的语句。
finally的使用场景,一般在数据库,文件操作、联网操作等时,在此期间如果产生错误则需要执行finally,关闭数据库等操作,防止占用内存的额外空间。
异常的传递
在函数调用时,如果函数多次嵌入调用函数,可以在最外层调用函数出添加try,函数会由里到外往外抛出错误,可在最外层接收异常,然后处理。
import random
def func(list1):
sum = 0
for a in list1:
print(a)
sum += a # raise
def get_random():
try:
list1 = []
for i in range(5):
ran = random.randint(1, 10)
list1.append(ran)
list1.append('9')
func(list1)
except Exception as err:
print('+++++++++++++++++>', err)
try:
get_random()
except Exception as err:
print(err)
print('==========>')
结果:
10
9
6
4
3
9
+++++++++++++++++> unsupported operand type(s) for +=: ‘int’ and ‘str’
==========>
内层函数已经接收了异常处理,则外层的try就不会再次处理异常了。
自定义异常
格式:
class XXXError(Exception):
def __init__(self,*args,**kwargs):
pass
使用:
raise xxxError("错误内容")
处理异常:
try:
异常代码
except:
处理异常
# 自定义异常
class UserNameError(Exception):
def __init__(self, *args, **kwargs):
pass
class PasswordError(Exception):
def __init__(self, *args, **kwargs):
pass
def register():
username = input('输入用户名:')
# 名字长度>=6,不能数字开头 '2'
if len(username) < 6 or username[0].isdigit():
# 用户名定义出错
raise UserNameError('用户名格式错误')
else:
print('用户名合法')
password = input('输入密码:')
if 10 >= len(password) >= 6:
print('注册成功')
else:
raise PasswordError('密码格式错误')
# 调用函数
try:
register()
except Exception as err:
print(err)
print('----->123')