except BaseException可以捕捉所有的异常,但是我们一般建议尽量捕捉可能出现的多个异常(按照先子类后父类的顺序),并且针对性的写出异常处理代码,最后再加上except BaseException。结构如下: try: 被监控的、可能引发异常的语句块 except Exception1: 处理exception1的语句块 except Exception2: 处理Exception2的语句块 … except BaseException: 处理可能遗漏的异常语句块
#测试try...多个except结构 while True: try: a=input("请输入一个被除数:") b=input("请输入一个除数:") c=float(a)/float(b) print(c) break except ZeroDivisionError: print("除数不能是0") except ValueError: print("输入的不是数字") except NameError: print("变量不存在") except BaseException as e: print(e)如果try块中没有异常,则执行else块。如果try中有异常,则执行except块,不执行else块。
while True: try: a=input("请输入被除数") b=input("请输入除数") c = float(a) / float(b) except ZeroDivisionError: print("除数不能是0") except ValueError: print("输入的不是数字") except NameError: print("变量不存在") except BaseException as e: print(e) else: print("c=",c," 程序结束!") break无论try块是否发生异常,finally块都会被执行;通常finally用来释放try块中申请的资源。
try: a=input("请输入被除数") b=input("请输入除数") c = float(a) / float(b) except ZeroDivisionError: print("除数不能是0") except ValueError: print("输入的不是数字") except NameError: print("变量不存在") except BaseException as e: print(e) else: print("c=",c," 程序结束!") finally: print("无论是否异常,都执行此模块") try: f=open("d:/a.txt","r") #打开文件 content = f.readline() #读取文件 print(content) #打印文件内容 except: print("文件未找到") finally: print("run in finally.关闭资源") #f.close() 这样写会出错!若文件没有找到并打开,就无法执行关闭操作 try: f.close() except BaseException as e: print(e) print("程序结束!")由于return有两种作用:结束方法运行、返回值。 通常情况下,不放在异常处理结构中(即try…except…else…finally都不放),而是放在最后。
finally通常用来释放资源,with可以更简便的释放资源。但with不是用来取代try的,只是作为补充,方便我们进行文件管理,在文件操作、网络通信等相关场合非常常用。
with context_expr[as var]: 语句块with代码块执行完毕后,将自动还原进入该代码之前的现场或上下文。不论是因为何种原因跳出with块,计算机总能保证资源的正常释放。
with open("d:/a.txt","r") as f: content = f.readline() #读取文件 print(content) #打印文件内容 print("程序结束!")