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