由于我们在Java中有try-catch,因此我可以在q kdb中找到trap-at。
但是我的要求是try-catch-finally,即在try块中,我打开odbc连接,最后我要关闭odbc连接。
Sudo code:
try{
con=openODBCConnection(dbName);
//n statements;
}catch(Exception e){
catchingNotSoImpException(e)
}finally{
closeODBCCon(con);
}
Run Code Online (Sandbox Code Playgroud)
这是在kdb中使用try-catch-finally逻辑的相当通用的方法,该方法将try-catch分离出来,始终运行“ finally”功能。如果在try或catch中成功(如果需要),则返回输出,或者在try和catch均已中断的情况下返回错误代码,从而允许(潜在地)对中断进行更有用的调查和/或安全性:
tcf:{[t;c;f]
r:@[(1b;)value@;t;@[(1b;)c@;;(0b;)::]];
f[];
$[r 0;r 1;'`$r 1]}
Run Code Online (Sandbox Code Playgroud)
最上面的一行是“ try-catch”部分。
@[(1b;)value@;t;@[(1b;)c@;;(0b;)::]]
Run Code Online (Sandbox Code Playgroud)
该函数的调用方式如下:
tcf[(tryfunc;1;`a);catchfunc;finallyfunc]
Run Code Online (Sandbox Code Playgroud)
因此输入必须是可以value在kdb中输入的内容-符号,函数和参数列表或字符串。
可以按原样使用,但有一个解释:
这里逻辑的键部分是突起(1b;)和(0b;)连同@上value或c功能告诉操作以等待输入-所以内的第一部分:
(1b;)value@
Run Code Online (Sandbox Code Playgroud)
等待输入t-如果值操作成功,(1b;correctOutput)则返回,即执行投影。
如果失败,错误将传递到
@[(1b;)c@;;(0b;)::]
Run Code Online (Sandbox Code Playgroud)
基本上是一样的东西,但是value它使用catch函数代替c。这是一个投影,它采用之前从失败值传递来的输入,然后应用与上述相同的操作。输出失败传递给全局null ::。
这样可以确保数据结构r如果try或catch成功,则前导1b,如果均失败,则前导0b。
finally然后运行该函数,如果出现两次失败,则返回成功答案或抛出错误。
使用与Rahul答案相似的定义的示例:
q)tryfunc
{x+y}
q)workingcatchfunc
{show "catch";100}
q)brokencatchfunc
{show "catch";1+`a}
q)finallyfunc
{show"finally"}
q)tcf[(tryfunc;1;1);workingcatchfunc;finallyfunc]
"finally"
2
q)tcf[(tryfunc;1;`a);workingcatchfunc;finallyfunc]
"catch"
"finally"
100
q)tcf[(tryfunc;1;`a);brokencatchfunc;finallyfunc]
"catch"
"finally"
'type
Run Code Online (Sandbox Code Playgroud)
这也适用于带有任意数量参数的函数:
q)tcf[(monot;1);brokencatchfunc;finallyfunc]
"finally"
10
q)tcf[(monot;`);brokencatchfunc;finallyfunc]
"catch"
"finally"
'type
Run Code Online (Sandbox Code Playgroud)