如何用Python Try/Except捕获含编号的库错误并继续执行
处理IB API中qualifyContracts的Error 200捕获与跳过问题
Interactive Brokers的Python API(如ib_insync或ibapi)不会将Error 200这类请求级错误抛出为常规Python异常,而是通过错误回调机制输出错误信息——这就是你直接用except Error 200抓不到错误的原因。以下是可行的处理方案:
1. 自定义错误回调,收集Error 200记录
首先替换默认错误处理函数,专门记录触发Error 200的请求ID(reqId)和对应合约:
from ib_insync import IB ib = IB() ib.connect('127.0.0.1', 7497, clientId=1) # 存储reqId到对应合约的映射 error_records = {} def error_callback(reqId, errorCode, errorString, contract): if errorCode == 200: error_records[reqId] = contract # 非200错误可保留默认打印行为 else: print(f"Error {errorCode}, reqId {reqId}: {errorString}") # 绑定自定义回调 ib.errorEvent += error_callback
2. 逐个处理合约,跳过触发错误的条目
不要批量传入所有合约,改为逐个调用qualifyContracts,每次请求后通过reqId检查是否触发了Error 200:
target_contracts = [你的合约列表] valid_contracts = [] for contract in target_contracts: # 获取当前请求的reqId(IB API自动递增) current_req = ib.client.getReqId() # 清空该reqId的旧记录(避免干扰) error_records.pop(current_req, None) try: ib.qualifyContracts(contract) # 若当前reqId无错误记录,说明验证通过 if current_req not in error_records: valid_contracts.append(contract) except Exception as e: # 捕获连接中断等全局异常 print(f"合约{contract}处理失败: {str(e)}") continue # valid_contracts即为所有验证通过的合约
针对旧版ibapi库的调整
如果你用的是官方原生ibapi(而非ib_insync),错误回调的参数格式不同,需修改为:
# 维护reqId与合约的映射 req_contract_map = {} error_records = set() def error_callback(reqId, errorCode, errorString): if errorCode == 200: error_records.add(reqId) # 绑定回调的方式也不同 ib.client.setErrorHandler(error_callback) # 处理合约时提前记录reqId与合约的对应关系 for contract in target_contracts: current_req = ib.client.getReqId() req_contract_map[current_req] = contract error_records.discard(current_req) try: ib.qualifyContracts(contract) if current_req not in error_records: valid_contracts.append(contract) except Exception as e: print(f"合约{contract}处理失败: {str(e)}") continue
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

