为何except Exception无法捕获ssl.SSLError异常?
为什么
except Exception无法捕获ssl.SSLError? 首先明确:ssl.SSLError是OSError的子类,而OSError属于Exception的派生类,理论上except Exception完全可以捕获它。如果没捕获到,大概率是以下几种场景导致:
异常不在
try代码块的执行范围内
检查代码缩进是否正确,若doSomething2()的缩进未与doSomething()对齐,导致它不在try块的覆盖范围内,抛出的异常自然不会被捕获。比如错误缩进示例:try: doSomething() doSomething2() # 此函数不在try块内,异常无法被捕获 except Exception: print("expection thrown, test should pass!")异常在其他线程/子进程中抛出
如果doSomething2()内部启动了独立线程或子进程,且异常是在这些执行单元中抛出的,当前主线程的try-except无法跨线程/进程捕获异常。比如线程内抛出异常的情况:import threading def doSomething2(): threading.Thread(target=lambda: raise ssl.SSLError()).start()异常被内部逻辑转换为
BaseException子类
若doSomething2()内部有自己的异常处理逻辑,将SSLError转换为SystemExit、KeyboardInterrupt这类BaseException的子类(这类异常不属于Exception范畴),那么except Exception就无法捕获。示例:def doSomething2(): try: # 触发SSLError的操作 except ssl.SSLError: raise SystemExit("SSL连接失败")异步代码未正确使用
await
如果你的代码是异步场景,doSomething2()是协程函数但未用await调用,协程内的异常不会被当前try-except捕获。错误写法示例:async def main(): try: doSomething() doSomething2() # 协程未await,异常无法被捕获 except Exception: print("expection thrown, test should pass!")
内容的提问来源于stack exchange,提问作者kkkl kkl
相关产品推荐
相关产品推荐

