You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Snowflake JavaScript存储过程预期失败却标记为成功?

Snowflake存储过程执行状态标记问题解答

为什么查询历史标记为成功?

Snowflake把这次call执行标记为成功,核心原因是整个存储过程的执行流程完整结束,没有未被捕获的异常。你在代码里用try-catch块捕获了内部无效SQL的错误,还把错误信息包装成返回值返回,存储过程本身没有触发任何未处理的异常,所以Snowflake判定这个存储过程调用是成功的——它只看存储过程有没有正常跑完,不关心你内部的SQL有没有出错。

如何让查询历史正确标记失败?

要让存储过程执行在查询历史里显示失败,必须在catch块里主动抛出一个未被捕获的异常,打断存储过程的正常执行流程。修改后的代码如下:

create procedure broken()
      returns varchar not null
      language javascript
      as
      $$
      var result = "";
      try {
          snowflake.execute( {sqlText: "Invalid Command!;"} );
          result = "Succeeded";
          }
      catch (err)  {
          // 构造完整错误信息并抛出
          var errorMsg =  "Failed: Code: " + err.code + "\n  State: " + err.state;
          errorMsg += "\n  Message: " + err.message;
          errorMsg += "\nStack Trace:\n" + err.stackTraceTxt; 
          throw errorMsg; // 主动抛出异常,让存储过程整体执行失败
          }
      return result;
      $$
      ;

调用修改后的存储过程时,不仅会看到错误信息,call命令的执行状态会被标记为失败,查询历史里也会同步显示失败状态。

额外说明

  • Snowflake判断存储过程调用是否成功的唯一标准是:存储过程是否无未捕获异常地完成执行。只要你用try-catch吞了内部错误,它就认为执行成功。
  • 抛出异常后,调用时的错误提示和你之前返回的自定义信息一致,但执行状态会从成功变成失败,满足查询历史的标记需求。

内容的提问来源于stack exchange,提问作者mas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:52:36