面向对象之异常处理
异常:
程序运行时的错误 程序中的异常处理机制: 1.程序中的所有异常都会被处理 2.程序中的所有异常都需要手动处理 3.如果没有手动处理异常,异常会交给Python解释器处理 -- 处理的方式就是打印异常信息,并停止接收器
异常信息的三部分:
1.异常的追踪信息:提示错误位置 2.异常的类型:告知处理异常应该捕获什么类型 3.异常的内容:告知错误信息
处理异常的语法:
try: 会出现异常的代码块 except (异常类型1, 异常类型2) as 异常别名: 异常处理逻辑 else: 没有出现异常会执行该分支 finally: 无论是否出现异常都会执行该分支
异常语法
将可能出现异常的代码放在try分支进行检测 -- 如果不出现异常,正常执行内部所有代码 -- 如果出现异常会进入except分支 part1 1.建议大家对异常处理时,一次只处理一个异常 try: print(asdsdsdsdsdsdsdsdsdsdsdsdsd) # NameError except NameError: # except 后跟异常类型,如果不需要查看异常信息,可以省略异常信息 print('出现了NameError异常') try: ls = [1, 2, 3, 4, 5] print(ls[10]) # IndexError except IndexError as e: # 如果想知道异常信息,用别名接收 print('出现了IndexError异常: %s' % e) part2 2.如果无法避免一句话或是一个完整的代码结构会出现多个可能的异常,需要在一个try中提供多个except ls = [1, 2, 3, 4, 5] ls = (1, 2, 3, 4, 5, 6) try: print(ls[5]) # IndexError ls.append(10) # AttributeError except IndexError as e: print('出现了IndexError异常: %s' % e) except AttributeError as e: print('出现了AttributeError异常: %s' % e) try: print(ls[5]) # IndexError ls.append(10) # AttributeError except (AttributeError, IndexError) as e: print('出现了异常: %s' % e) part3 3.有些异常提前无法明确,或是压根没有明确的必要,可以捕获异常的父类异常 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) BaseException:所有异常的基类 | Exception:常规错误的基类 part4 4.了了解 - try语法的else分支:当try检测的代码块没有出现异常,才会走else分支 try: print(aaaa) except Exception as e: print('出现了异常', e) else: print('没有异常') part5 5.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 | BaseException pass 可以通过__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: 人名不能有敏感词汇