Python中Try-Except块需按Ctrl+C才捕获RuntimeWarning异常的问题
解决RuntimeWarning无法被try-except捕获的问题
这个问题的根源其实是RuntimeWarning属于警告(warning)而非标准异常(exception),Python默认只会打印警告信息,不会抛出异常,所以你的try-except块根本“看不到”它——这就是为什么警告会直接输出到屏幕,而且只有手动按Ctrl+C中断程序时,才会触发后续的break逻辑。
要解决这个问题,我们可以用Python内置的warnings模块,把特定的RuntimeWarning转换成可被捕获的异常,具体方案如下:
1. 精准匹配目标警告(推荐)
如果你只想处理你遇到的invalid value encountered in double_scalars这类特定RuntimeWarning,可以精准匹配警告的类别和消息,避免影响其他类型的警告:
import warnings # 仅将指定的RuntimeWarning转换为可捕获的异常 warnings.filterwarnings( "error", category=RuntimeWarning, message="invalid value encountered in double_scalars" ) exception_check = False exception_count = 0 for i in range(sz): try: r[i],u[i],p[i],tr[i] = solver(S[i],trhoL,trhoR,tuL,tuR,tpL,tpR,gamma) except RuntimeWarning: exception_check = True exception_count += 1 print("Skipping test....") break
2. 全局捕获所有RuntimeWarning(简单粗暴)
如果需要捕获所有类型的RuntimeWarning,可以简化设置:
import warnings # 将所有RuntimeWarning转换为异常 warnings.filterwarnings("error", category=RuntimeWarning) # 后续执行你的原循环逻辑 exception_check = False exception_count = 0 for i in range(sz): try: r[i],u[i],p[i],tr[i] = solver(S[i],trhoL,trhoR,tuL,tuR,tpL,tpR,gamma) except RuntimeWarning: exception_check = True exception_count += 1 print("Skipping test....") break
补充说明
- 原理:
warnings.filterwarnings("error")会把指定类别的警告升级为异常,触发时Python会直接抛出该异常,此时try-except就能正常捕获并执行你的处理逻辑,无需手动中断。 - 恢复默认行为:如果之后需要回到“只打印警告不抛出异常”的状态,可以调用
warnings.filterwarnings("default")重置设置。
这样修改后,当solver函数触发目标警告时,程序会立刻进入except块执行你的跳转逻辑,不会再输出原始警告信息,也不需要手动按Ctrl+C了。
内容的提问来源于stack exchange,提问作者turboandrew
相关产品推荐
相关产品推荐

