Error handling KDB:尝试捕获列表并返回失败列表

Error handling KDB:尝试捕获列表并返回失败列表,error-handling,controls,try-catch,kdb,Error Handling,Controls,Try Catch,Kdb,我想运行这个函数 {`Security$x} 在名单上 订单'KDB_secu_ID 并返回失败值的列表。我有下面的代码,它可以工作,但是我想知道是否有一种更简洁的方法来编写它而不使用do循环 示例代码: idx:0; fails:(); do[count (order`KDB_SEC_ID); error:@[{`Security$x};(order`KDB_SEC_ID)[idx];0Nj]; if[error=0Nj;fails:fails,(order`KDB_SEC_ID

我想运行这个函数

{`Security$x}

在名单上

订单'KDB_secu_ID

并返回失败值的列表。我有下面的代码,它可以工作,但是我想知道是否有一种更简洁的方法来编写它而不使用do循环

示例代码:

idx:0; 
fails:(); 
do[count (order`KDB_SEC_ID); 
  error:@[{`Security$x};(order`KDB_SEC_ID)[idx];0Nj];
  if[error=0Nj;fails:fails,(order`KDB_SEC_ID)[idx]];
  idx:idx+1;
  ];
  missingData:select from order where KDB_SEC_ID in distinct fails;

如果您的测试是检查哪些
KDB_secu_ID
可以根据
安全性
列表枚举,您不能这样做吗

q)select from order where not KDB_SEC_ID in Security
还是我遗漏了什么

为了在更一般的情况下回答您的问题,您可以使用以下方法实现对列表的try-catch以返回失败列表

q){x where @[{upper x;0b};;1b] each x}(2;`ab;"Er";1)
2 1

如果您的测试是检查哪些
KDB_secu_ID
可以根据
安全性
列表枚举,您不能这样做吗

q)select from order where not KDB_SEC_ID in Security
还是我遗漏了什么

为了在更一般的情况下回答您的问题,您可以使用以下方法实现对列表的try-catch以返回失败列表

q){x where @[{upper x;0b};;1b] each x}(2;`ab;"Er";1)
2 1

我同意Terry的答案是最简单的方法,但这里有一个更简单的方法来实现你试图帮助你看到如何在不使用do循环的情况下实现它的方法

q)SECURITY
`AAPL`GOOG`MSFT

q)order
KDB_SEC_ID val
--------------
AAPL       1
GOOG       2
AAPL       3
MSFT       4
IBM        5

q)order where @[{`SECURITY$x;0b};;1b] each order`KDB_SEC_ID
KDB_SEC_ID val
--------------
IBM        5

如果通过,则输出
0b
;如果失败,则输出
1b
,从而生成布尔列表。在布尔列表上使用
where
返回出现
1b
的索引,您可以使用该索引将
顺序编入
,以返回失败的行。

我同意Terry的答案是最简单的方法,但这里有一种更简单的方法,可以帮助您了解如何在不使用do循环的情况下实现它

q)SECURITY
`AAPL`GOOG`MSFT

q)order
KDB_SEC_ID val
--------------
AAPL       1
GOOG       2
AAPL       3
MSFT       4
IBM        5

q)order where @[{`SECURITY$x;0b};;1b] each order`KDB_SEC_ID
KDB_SEC_ID val
--------------
IBM        5
如果通过,则输出
0b
;如果失败,则输出
1b
,从而生成布尔列表。在布尔列表上使用
where
返回出现
1b
的索引,您可以使用该索引索引到
顺序
,以返回失败的行