try代码块中exit(0)无法退出程序的原因咨询
问题原因与解决方案
核心原因
exit(0) 执行时会抛出 SystemExit 异常,而你代码中的裸 except: 会捕获所有继承自 BaseException 的异常(包括SystemExit)。当exit的异常被except块拦截后,程序不会终止,而是执行完print("in except")后回到while True循环,继续下一次迭代,最终出现循环打印的情况。
修复方案
有几种可行的解决方式:
1. 限制except捕获的异常范围
把裸except:改成捕获特定异常(比如只捕获Exception类的异常),因为SystemExit属于BaseException,不会被Exception捕获,这样exit()就能正常触发程序退出:
import time a=1 while True: time.sleep(2) try: if a==1: print("exiting") exit(0) else: print("in else") except Exception: # 仅捕获Exception子类异常,不包含SystemExit print("in except")
2. 捕获后重新抛出SystemExit异常
如果必须用裸except,可以在块内判断异常类型,若是SystemExit则重新抛出:
import time a=1 while True: time.sleep(2) try: if a==1: print("exiting") exit(0) else: print("in else") except: import sys exc_type, exc_value, _ = sys.exc_info() if exc_type is SystemExit: raise # 重新抛出SystemExit,让程序正常退出 print("in except")
3. 替代exit的方式
可以直接用break跳出循环,再在循环外执行退出操作:
import time a=1 while True: time.sleep(2) try: if a==1: print("exiting") break # 跳出循环 else: print("in else") except: print("in except") exit(0) # 循环外执行退出
内容的提问来源于stack exchange,提问作者sovon
相关产品推荐
相关产品推荐

