You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:55:46