Python3.8.9中SSLCertVerificationError为何被ValueError而非OSError捕获?
问题解析与解决
在Python 3.8.x版本中,ssl.SSLCertVerificationError存在多重继承的实现细节:它同时是ValueError和OSError的子类。这就是为什么你的代码里ValueError分支会先捕获到异常——Python的except分支是按从上到下的顺序匹配的,只要某个异常类与分支中的类型兼容,就会触发该分支。
你可以用以下代码验证这个继承关系:
import ssl print(issubclass(ssl.SSLCertVerificationError, ValueError)) # 输出 True print(issubclass(ssl.SSLCertVerificationError, OSError)) # 输出 True
解决办法
根据需求,有两种可行的调整方式:
优先捕获具体异常:如果想精准处理
SSLCertVerificationError,把它的except分支放在最前面:import ssl def bar(): raise ssl.SSLCertVerificationError try: bar() except ssl.SSLCertVerificationError: print('Got SSLCertVerificationError') except ValueError: print('Got ValueError') except OSError: print('Got OSError')调整分支顺序:如果希望
OSError分支优先匹配,把它移到ValueError前面(注意这会让所有OSError子类异常都被这个分支捕获,包括SSLError相关的):import ssl def bar(): raise ssl.SSLCertVerificationError try: bar() except OSError: print('Got OSError') except ValueError: print('Got ValueError')
另外这个行为在Python 3.9+版本中已经调整,SSLCertVerificationError不再继承ValueError,仅作为OSError的子类存在,升级Python版本也能解决这个问题。
内容的提问来源于stack exchange,提问作者Boaz
相关产品推荐
相关产品推荐

