Python中如何让TimeoutException仅在框架层捕获,不被自定义代码拦截?
解决方案:用BaseException子类实现不受普通捕获影响的超时异常
Python里普通的except:只会捕获Exception及其子类,但不会捕获直接继承自BaseException的异常。我们可以利用这个特性,自定义一个特殊的超时异常,让用户自定义代码的try...catch抓不到它,只能由框架层处理。
1. 定义专属的框架超时异常
class FrameworkTimeout(BaseException): """框架专属超时异常,不受普通except捕获""" pass
2. 修改time_limit上下文管理器
把原来抛出TimeoutException的逻辑,改成抛出这个FrameworkTimeout。
3. 框架代码捕获异常
def main(): try: with time_limit(30): # 超时后抛出FrameworkTimeout my_function() except FrameworkTimeout: print("timeout!") # 用户自定义代码(完全不用修改) def my_function(): try: do_something() except: # 这里只会抓Exception子类,FrameworkTimeout会直接透传 pass
核心原理
Python的异常体系里,BaseException是所有异常的根,Exception是它的子类。普通的except:等价于except Exception:,只会捕获Exception分支下的异常。而我们自定义的FrameworkTimeout直接继承BaseException,不属于Exception的子类,所以用户代码里的except:根本抓不到它,会直接向上传递到框架的捕获逻辑里。
注意点
如果用户自定义代码里写了except BaseException:,那还是会捕获这个异常,但这种写法在正常业务代码里非常罕见,属于极端情况。
内容的提问来源于stack exchange,提问作者Honya15
相关产品推荐
相关产品推荐

