同一异常块处理socket.error与socket.timeout时无法捕获超时异常的问题
问题分析与解决
核心错误点
独立异常块的顺序错误:你原本的独立异常块写法是允许的,但
socket.timeout是socket.error的子类,Python异常捕获遵循从上到下匹配的规则,父类异常会优先捕获子类异常。你把socket.error放在前面,导致所有socket.timeout异常都会被前者拦截,永远走不到socket.timeout的分支——这可能是你误以为独立写法不允许的原因。合并异常块的判断逻辑错误:你写的
if socket.error:是在判断socket.error这个类对象是否为真(Python中类对象永远为真),而不是判断捕获到的异常实例e的类型。所以不管实际触发的是哪种异常,都会进入第一个分支。
正确写法
写法1:使用独立异常块(推荐)
调整异常捕获顺序,把子类异常放在父类异常前面,确保socket.timeout能被优先匹配:
except socket.timeout as e: server_response.setCode(ServerResponse.CRITICAL) server_response.writeCriticalMessage('Customer: ' + user['name'] + ' - Connection timeout after %s seconds' % arguments.timeout) except socket.error as e: print("2") server_response.setCode(ServerResponse.CRITICAL) server_response.writeCriticalMessage('Customer: ' + user['name'] + ' - Connection error: %s' % (e))
写法2:合并异常块后正确判断类型
如果一定要合并捕获,需要用isinstance()判断异常实例的类型,且先判断子类异常:
except (socket.error, socket.timeout) as e: server_response.setCode(ServerResponse.CRITICAL) if isinstance(e, socket.timeout): server_response.writeCritical('Customer: ' + user['name'] + ' - Connection timeout after %s seconds' % arguments.timeout) else: server_response.writeCritical('Customer: ' + user['name'] + ' - Connection error: %s' % (e))
内容的提问来源于stack exchange,提问作者dean89
相关产品推荐
相关产品推荐

