九、异常处理
需求:当程序遇到问题不让程序结束,而越过错误继续向下执行
try……except……else 格式: try: 语句t except 错误码 as e: 语句1 except 错误码 as e: 语句2 …… …… else: 语句f 注意:else语句可有可无 作用:用来检测try语句块中的错误,从而让except语句捕获错误信息并处理 逻辑: 1、如果try:“语句t”执行出现错误,会匹配第一个错误码,如果 匹配上就执行对应“语句” 2、如果当try“语句t”执行没有错误,没有匹配的异常,错误将会 匹配上一层的try“语句”,或者到程序的最上层 3、如果当try"语句t"执行没有出现错误,执行else下的“语句”(你得有) try: print(3 / 0) except ZeroDivisionError as e: print("除数为0了") else: print("*") print("*****") try: print(4 / 0) print(nums) except: print("程序出现异常") #使用except带着多种异常 try: pass print(4 / 0) print(nums) except(ZeroDivisionError, NameError ): print("出现了NameError,ZeroDivisionError") 特殊 1、错误其实是class(类),所有的错误都是继承自BaseException,所以在捕获的时候,他捕获了该类型的错误,还把子类一网打尽 try: print(5 / 0) except BaseException as e: print("异常1") except ZeroDivisionError as e: print("异常2") #2、跨越多层调用,main()调用了func1 def func1(num): print(1 / num) def func2(num): func1(num) def main(): func2(0) try: main() except ZeroDivisionError as e: print("******") try ……except……finally 格式: try: 语句t except 错误码 as e: 语句1 except 错误码 as e: 语句2 …… …… finally: 语句f 作用:语句t无论是否有错误都执行最后的语句f try: print(1/0) except ZeroDivisionError as e: print("******") finally: print("必须执行我") # 断言 def func(num, div): assert (div != 0),"""div不能为0""" return num / div print(func(10, 0))
9-1 捕获异常
# 捕获简单异常 try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) except ZeroDivisionError: print("第二个数不能为0")
9-2 捕获多个异常
# 捕获简单异常 try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) except ZeroDivisionError: print("第二个数不能为0") except ValueError: print("只能输入数字")
try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) # 捕获多个异常,用同一种处理方法 except (ZeroDivisionError, ValueError): print("第二个数不能为0") print("只能输入数字")
9-3 捕获异常的描述信息
try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) # 捕获异常的描述信息 except (ZeroDivisionError, ValueError) as result: print("捕获到异常:%s"%(result))
9-4 捕获所有异常
try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) # 捕获到所有异常,都执行同样的处理 except : print("捕获到异常")
try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) # 捕获到所有异常,输出异常类型 except Exception as result: print("捕获到异常:%s"%(result))
9-7 没有捕获到异常,执行else语句
try: print("-"*20) first_number = input("输入第一个数:") second_number = input("输入第二个数:") print(int(first_number) / int(second_number)) print("-"*20) # 捕获到所有异常,输出异常类型 except Exception as result: print("捕获到异常:%s"%(result)) # 没有捕获到异常时,执行else语句 else: print("程序正常运行,没有捕获到异常。")
9-8 终止行为:无论有没有异常都要执行的语句
import time try: file = open("test.txt", "w+") while True: content = file.read() if len(content) == 0: break; time.sleep() print(content) # 始终要执行的语句 finally: file.close() print("关闭文件")
9-10 自定义异常
class ShortInputException(Exception): # 自定义异常类 def __init__(self, length, atleast): self.length = length # 输入长度 self.atleast = atleast # 至少长度 try: text = input("输入密码:") if len(text) < 3: # raise 引发一个刚刚定义的异常 raise ShortInputException(len(text), 3) except EOFError: print("您输入了一个结束标识符") except ShortInputException as result: print("ShortInputException:输入的长度是%d,长度至少是%d" %(result.lenth, result.atleast)) else: print("没有异常发生。")