函数捕获Exception时如何继续执行while循环?
解决方案
方法1:让函数返回执行状态标记
既然每个函数内部已经写了try/except块,那可以在捕获异常时返回一个失败标记(比如False),正常执行完逻辑后返回True。主循环里调用每个函数后立刻检查返回值,只要有一个函数返回False,就执行continue跳回循环顶部。
示例代码:
def func1(): try: # 这里写func1的业务逻辑 print("执行func1") # 可以取消下面的注释模拟异常 # raise Exception("func1出错啦") return True except Exception as e: print(f"func1捕获异常: {str(e)}") return False def func2(): try: # 这里写func2的业务逻辑 print("执行func2") # 可以取消下面的注释模拟异常 # raise Exception("func2出错啦") return True except Exception as e: print(f"func2捕获异常: {str(e)}") return False # 永久循环 while True: # 逐个调用函数,只要有一个失败就重启循环 if not func1(): continue if not func2(): continue # 其他函数按同样方式添加... # 所有函数都正常执行时,才会走到这里 print("本轮所有函数执行完成,进入下一轮")
这种方式不需要在主循环里堆一堆try/except,只需要判断返回值,代码结构清爽。
方法2:自定义异常+主循环统一捕获
如果觉得返回值的方式不够直观,可以定义一个专属的自定义异常类。让每个函数在捕获到通用Exception后,抛出这个自定义异常,然后在主循环最外层加一个try/except块专门捕获它,捕获到就执行continue。
示例代码:
# 定义一个自定义异常,用来标记任务执行失败 class TaskFail(Exception): pass def func1(): try: # func1的业务逻辑 print("执行func1") # 取消注释模拟异常 # raise Exception("func1出问题了") except Exception as e: print(f"func1捕获异常: {str(e)}") # 抛出自定义异常通知主循环 raise TaskFail from e def func2(): try: # func2的业务逻辑 print("执行func2") # 取消注释模拟异常 # raise Exception("func2出问题了") except Exception as e: print(f"func2捕获异常: {str(e)}") raise TaskFail from e # 永久循环 while True: try: func1() func2() # 其他函数按同样方式添加... # 所有函数正常执行后的逻辑 print("本轮任务全部完成,准备下一轮") except TaskFail: # 只要捕获到自定义异常,就直接回到循环开头 continue
这种方式主循环只需要一个try/except块,语义更清晰——抛出TaskFail就明确表示“这个任务失败了,要重启循环”,后续如果有不同类型的失败场景,还可以扩展自定义异常的子类,灵活性更强。
内容的提问来源于stack exchange,提问作者QFi
相关产品推荐
相关产品推荐

