专家
对雪花中的异常处理有疑问。我了解我们可以使用try&catch块来处理错误,并使用return / throw错误消息。
请让我知道是否有问题。
答案 0 :(得分:3)
Throw将生成一个新错误或将现有错误发送到堆栈中。如果您使用try / catch块并在错误上“返回”信息,那么您要离开的函数将不会指示错误情况。它可能会发送有关错误的信息,但是由于代码捕获了错误,因此如果堆栈中没有任何内容捕获该错误,它将不会进入堆栈并可能终止执行。
当您从Snowflake UI运行JavaScript UDF或存储过程时,您可以判断出存在未捕获的错误,因为返回的结果是红色的。如果错误以黑色或蓝色显示,则即使错误消息报告了错误,也已将其捕获,并且呼叫状态不是错误。这是一个示例:
create or replace procedure FOO()
returns string
language javascript
as
$$
// Run a helper function here
myFunction();
function myFunction(){
var mySqlStatement = "select * from NONEXISTENT_TABLE";
var statement1 = snowflake.createStatement({sqlText: mySqlStatement});
statement1.execute();
}
$$;
call foo(); // This will generate an error and return in red text.
create or replace procedure FOO()
returns string
language javascript
as
$$
try{
myFunction();
}
catch(e){
return e.message;
}
function myFunction(){
var mySqlStatement = "select * from NONEXISTENT_TABLE";
var statement1 = snowflake.createStatement({sqlText: mySqlStatement});
statement1.execute();
}
$$;
call foo();
// This will catch an error and return it in blue text.
//External clients will not report an error, even through the
//SP returns the error message.