使用错误陷阱调用KDB函数时出现类型错误的问题排查
问题:使用错误陷阱调用KDB函数时出现类型错误
我编写了一个连接进程、提取并返回信息的函数func1:
func1:{[processName] h: hopen getConnDetails[processName]; sampleData:h"select from tableName where sym=`someSym"; sampelData:update trueTime:.z.t from sampleData; hclose h; allData,:sampleData allData }each processName;
该函数单独运行完全正常,但当我通过init函数使用错误陷阱(@[])调用它时,在将sampleData添加到allData的步骤中出现类型错误。修改后的func1和init函数如下:
func1:{[processName] h: hopen getConnDetails[processName]; sampleData:h"select from tableName where sym=`someSym"; sampelData:update trueTime:.z.t from sampleData; hclose h; allData,:sampleData allData } init:{[] processName:exec distinct processName from someProcess; @[func1;;{Show "Error calling function with error: ",x}]each processName }
注意:func1和init位于同一命名空间。请问我忽略了什么?
问题分析与解决方案
核心问题1:全局变量allData未正确初始化
单独运行func1时,你大概率已经在命名空间中手动初始化过allData(比如设为空表()),但通过init批量调用时,allData可能未被定义,或在某次错误触发后状态异常。allData,:sampleData要求allData必须是与sampleData同结构的表(或空列表),如果allData未初始化,直接执行,:会触发类型不匹配错误。
核心问题2:错误陷阱的执行逻辑错误
@[func1;;errHandler]each processName的写法有误——@[]的第一个参数是待执行的函数,但这里each会把每个processName传给@[],而非直接传给func1,导致func1未接收到正确参数,进而引发后续逻辑错误。
次要问题:拼写冗余
函数内存在笔误:sampelData应为sampleData,该变量后续未被使用,属于冗余代码,虽不触发当前错误,但建议修正。
修正后的代码示例
方案1:保留全局变量逻辑
// 先在命名空间初始化全局变量allData allData:() func1:{[processName] h: hopen getConnDetails[processName]; sampleData:h"select from tableName where sym=`someSym"; sampleData:update trueTime:.z.t from sampleData; // 修正拼写错误 hclose h; allData,:sampleData; // 加分号确保语句执行完成 allData } init:{[] processName:exec distinct processName from someProcess; // 调整each作用范围,确保每个func1调用都被错误陷阱包裹 {[pn] @[func1;pn;{Show "Error calling function with error: ",x}]} each processName }
方案2:避免全局变量(推荐)
改用函数式风格,让func1返回单进程数据,最后在init中汇总结果,减少全局状态带来的问题:
func1:{[processName] h: hopen getConnDetails[processName]; sampleData:h"select from tableName where sym=`someSym"; sampleData:update trueTime:.z.t from sampleData; hclose h; sampleData } init:{[] processName:exec distinct processName from someProcess; // 收集所有成功返回的结果,错误进程返回空表并打印日志 allData:raze @[func1;;{Show "Error calling function with error: ",x; ()}] each processName; allData }
内容的提问来源于stack exchange,提问作者CleanSock
相关产品推荐
相关产品推荐

