异常
异常:异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常,异常就是Python对象,表示一个错误。当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
程序运行时的错误
程序中的异常处理机制:
1.程序中的所有异常都会被处理
2.程序中的所有异常都需要手动处理
3.如果没有手动处理异常,异常会交给Python解释器处理
– 处理的方式就是打印异常信息,并停止接收器
异常处理
异常信息的三部分:
1.异常的追踪信息:提示错误位置
2.异常的类型:告知处理异常应该捕获什么类型
3.异常的内容:告知错误信息
处理异常的语法:
try:
# 会出现异常的代码块
except 异常类型 as 异常别名:
# 异常处理逻辑
else:
# 没有出现异常会执行该分支
finally:
# 无论是否出现异常都会执行该分支
将可能出现异常的代码放在try分支进行检测
– 如果不出现异常,正常执行内部所有代码
– 如果出现异常会进入except分支
建议对异常处理时,一次只处理一个异常
try:
print(asdsdsdsdsdsdsdsdsdsdsdsdsd) # NameError
except 后跟异常类型,如果不需要查看异常信息,可以省略异常信息
except NameError:
print('出现了NameError异常')
try:
ls = [1, 2, 3, 4, 5]
print(ls[10]) # IndexError
如果想知道异常信息,用别名接收
except IndexError as e:
print('出现了IndexError异常: %s' % e)
如果无法避免一句话或是一个完整的代码结构会出现多个可能的异常,需要在一个try中提供多个except
ls1 = [1, 2, 3, 4, 5]
try:
print(ls1[5]) # IndexError
ls1.append(10) # AttributeError
except IndexError as e:
print('出现了IndexError异常: %s' % e)
except AttributeError as e:
print('出现了AttributeError异常: %s' % e)
ls2 = (1, 2, 3, 4, 5,6)
try:
print(ls2[5]) # IndexError
ls2.append(10) # AttributeError
except (AttributeError, IndexError) as e:
print('出现了异常: %s' % e)
有些异常提前无法明确,或是压根没有明确的必要,可以捕获异常的父类异常
BaseException:所有异常的基类 | Exception:常规错误的基类
ls = [1, 2, 3, 4, 5]
# ls = (1, 2, 3, 4, 5, 6)
try:
print(ls[5]) # IndexError
ls.append(10) # AttributeError
可以通过多态的应用,捕获父类,只要抛出的是该父类的子类异常,均可以被捕获
except Exception as e:
print('出现了异常: %s' % e)
finally:无论是否出现异常都会执行该分支
try:
f = open('1.txt', 'w', encoding='utf-8')
f.write(b'123')
except Exception as e:
print('出现了异常', e)
finally:
print('无论是否出现异常都会执行该分支')
f.close() # 文件只要打开,不管操作是否出现异常,都需要释放文件资源
print('end')
自定义异常的目的:想抛一个有意义的异常,但这个异常系统没有提供,自定义一个
# raise ValueError('输入的不能被转换为int类型')
def get_int():
num = input('num: ')
try:
return int(num)
except ValueError:
raise ValueError('输入的不能被转换为int类型')
num = get_int()
print(num)
class PeopleNameError(Exception):
# 可以通过__init__明确外界的错误信息接收给那个属性
# 再在__str__中格式化外界捕获异常,打印异常信息的格式
def __init__(self, msg):
self.msg = msg
def __str__(self):
return 'PeopleNameError: ' + self.msg
def get_name():
name = input('name: ')
if 'sb' in name.lower():
raise PeopleNameError('人名不能有敏感词汇')
return name
try:
print(get_name())
except PeopleNameError as e:
print(e) # PeopleNameError: 人名不能有敏感词汇