QKDB中的异常/错误处理——Try-Catch-Finally(Java)/Try-Except-Finally(Python)的替代方案

QKDB中的异常/错误处理——Try-Catch-Finally(Java)/Try-Except-Finally(Python)的替代方案,kdb,Kdb,由于我们在java中尝试了catch,我可以在QKDB中找到陷阱。 但我的要求是try-catch-finally,即在try块中我打开odbc连接,在finally中我想关闭odbc连接 Sudo code: try{ con=openODBCConnection(dbName); //n statements; }catch(Exception e){ catchingNotSoImpException(e) }finally{ closeODBCCon(con); }

由于我们在java中尝试了catch,我可以在QKDB中找到陷阱。
但我的要求是try-catch-finally,即在try块中我打开odbc连接,在finally中我想关闭odbc连接

Sudo code:

try{
  con=openODBCConnection(dbName);
  //n statements;
}catch(Exception e){
   catchingNotSoImpException(e)
}finally{
 closeODBCCon(con);
}

KDB中没有
finally
块。在KDB中使功能更接近于此的一种方法是为
final
块编写一个函数,并在try和catch中调用它。这并不能保证此功能将始终执行,但将涵盖大多数情况

q)finally:{show "finally"}
q)try:{show "try"; show x+y;finally[]}
q)catch:{show "catch"; finally[]}
q).[try;1 2;catch]
现在,在try-and-catch中调用
finally
函数非常重要。呼叫顺序可能会改变行为。我的建议是在最后调用它,并始终从
finally
函数返回结果。如果有来自
try或catch
函数的任何返回值,则将该值传递给
finally
函数。这将减少出错的机会,使代码变得简单,并消除其他开销,如呼叫排序问题

来自
try
块的返回值示例:

q) finally:{show "finally"; :x}
q) try:{show "try";r:x+y;finally r}
q) catch:{show "catch"; finally[]}
q) .[tyr;1 2;catch]

KDB中没有
finally
块。在KDB中使功能更接近于此的一种方法是为
final
块编写一个函数,并在try和catch中调用它。这并不能保证此功能将始终执行,但将涵盖大多数情况

q)finally:{show "finally"}
q)try:{show "try"; show x+y;finally[]}
q)catch:{show "catch"; finally[]}
q).[try;1 2;catch]
现在,在try-and-catch中调用
finally
函数非常重要。呼叫顺序可能会改变行为。我的建议是在最后调用它,并始终从
finally
函数返回结果。如果有来自
try或catch
函数的任何返回值,则将该值传递给
finally
函数。这将减少出错的机会,使代码变得简单,并消除其他开销,如呼叫排序问题

来自
try
块的返回值示例:

q) finally:{show "finally"; :x}
q) try:{show "try";r:x+y;finally r}
q) catch:{show "catch"; finally[]}
q) .[tyr;1 2;catch]

这是在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]}
顶行是“try-catch”部分

@[(1b;)value@;t;@[(1b;)c@;;(0b;)::]]
函数的调用方式如下:

tcf[(tryfunc;1;`a);catchfunc;finallyfunc]
因此,输入必须是kdb中的
”符号、函数和参数列表或字符串

这可以按原样使用,但用于解释:

这里逻辑的关键部分是
(1b;)
(0b;)
以及
@
值上的投影,或者
c
函数告诉操作等待输入-因此在第一部分中:

(1b;)value@
等待输入
t
-如果值操作成功,则返回
(1b;correctOutput)
,即执行投影

如果失败,错误将传递给

@[(1b;)c@;;(0b;)::]
这基本上是一样的,但是它使用catch函数,
c
,而不是
value
。这是一个投影,它获取之前失败值传递的输入,然后应用与上面相同的操作。将失败的输出传递给全局null

这确保了如果try或catch成功,则数据结构r的前导为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
这也适用于具有任意数量参数的函数:

q)tcf[(monot;1);brokencatchfunc;finallyfunc]
"finally"
10
q)tcf[(monot;`);brokencatchfunc;finallyfunc]
"catch"
"finally"
'type

这是在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]}
顶行是“try-catch”部分

@[(1b;)value@;t;@[(1b;)c@;;(0b;)::]]
函数的调用方式如下:

tcf[(tryfunc;1;`a);catchfunc;finallyfunc]
因此,输入必须是kdb中的
”符号、函数和参数列表或字符串

这可以按原样使用,但用于解释:

这里逻辑的关键部分是
(1b;)
(0b;)
以及
@
值上的投影,或者
c
函数告诉操作等待输入-因此在第一部分中:

(1b;)value@
等待输入
t
-如果值操作成功,则返回
(1b;correctOutput)
,即执行投影

如果失败,错误将传递给

@[(1b;)c@;;(0b;)::]
这基本上是一样的,但是它使用catch函数,
c
,而不是
value
。这是一个投影,它获取之前失败值传递的输入,然后应用与上面相同的操作。将失败的输出传递给全局null

这确保了如果try或catch成功,则数据结构r的前导为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
这也适用于具有任意数量参数的函数:

q)tcf[(monot;1);brokencatchfunc;finallyfunc]
"finally"
10
q)tcf[(monot;`);brokencatchfunc;finallyfunc]
"catch"
"finally"
'type