雪花存储过程异常与失败

时间:2020-10-02 17:37:11

标签: exception stored-procedures snowflake-cloud-data-platform

专家

对雪花中的异常处理有疑问。我了解我们可以使用try&catch块来处理错误,并使用return / throw错误消息。

  1. throw和return之间有什么区别-我尝试了两者,并且表现相同。
  2. 以上两者均发回错误消息。但是在调用程序中不会失败。我们是否与oracle中的RAISE错误类似。

请让我知道是否有问题。

1 个答案:

答案 0 :(得分:3)

  1. return关键字返回一个值并退出当前函数。返回的值可能是错误消息,但它是作为常规字符串而不是错误条件返回的。
  2. throw关键字引发错误并退出当前函数。如果执行堆栈中的任何内容都未捕获到错误,则执行会因错误而停止。

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.