将陷阱与KDB和未声明的变量一起使用



例如,我正试图在x不存在的地方进行try-catch:

@[x;::;"error"]

我得到的是'x错误,而不是"error"错误。我做错了什么?

您可以使用value关键字来确定变量是否存在。错误捕获这可能是你想要的?

q)@[value;`x;"error"]
"error"
q)x:12
q)@[value;`x;"error"]
12

查看此处的文档https://code.kx.com/q/ref/apply/#trap"在三进制中,如果函数的求值失败,则表达式被求值为"0";

无法计算函数x,因为它不存在。函数在这里没有失败,只是无法调用。这里的提示是经过评估的——我们可以使用值来检查函数是否存在。

q)f:{x+x}
q)@[value;`f;"error"]
{x+x}
q)@[value;`p;"error"]
"error"

已定义函数f上的值的返回与未定义的东西的值的比较p>

q)value f
0x6161410003
,`x
`symbol$()
,`
5 3 4 2 2
"..f"
""
-1
"{x+x}"
q)value p
'p
[0]  value p
^

请注意,在变量名上使用value只有在您要检查的变量是全局变量时才有效,而对于本地变量则无效:

q){@[value;`v;"error"]}[]
"error"
q){v:9;@[value;`v;"error"]}[]
"error"

尽管在现实中,在大多数情况下,你会寻找一个全球性的,所以这将起作用。

如果你要找的是当地人,那么事情会变得有点混乱,但从技术上讲是可能的:

q){locals:?[(`$())!();();();{x!x}raze(value .z.s)1 2];$[`v in key locals;locals`v;'"error"]}[]
'error
q){v:9;locals:?[(`$())!();();();{x!x}raze(value .z.s)1 2];$[`v in key locals;locals`v;'"error"]}[]
9

最新更新