Snowflake JavaScript存储过程抛出异常报错,如何修复?
修复Snowflake JavaScript存储过程抛出异常后错误元数据缺失的问题
问题场景
我尝试使用以下JavaScript存储过程代码,意图在特定ID将作为重复记录插入时抛出异常:
try { if ( isDuplicate == 'Y' ){ throw new Error("This is a duplicate record"); } else { snowflake.execute({sqlText: `INSERT INTO TEMP2_Table SELECT Id, Name FROM TEMP1_Table;`}); } } catch (err) { throw err; }
但运行后出现如下错误:
ERROR -> Technical Error Occured FAIL_CODE : undefined STATE : undefined MESSAGE : This is a duplicate record STACK_TRACE : undefined QUERY_ID : 01aaf508-3200-ad9f-0000-631d265e1b7e EXECUTED_SP : myproc EXECUTION_SATUS : FAILURE
解决方案
问题根源在于直接抛出原生JavaScript的Error对象,Snowflake无法从该对象中提取标准错误码(FAIL_CODE)、SQL状态(STATE)等元数据,导致这些字段显示为undefined。
推荐使用Snowflake提供的Snowflake.createError()方法创建标准化错误对象,具体代码修改如下:
try { if (isDuplicate == 'Y') { // 创建符合Snowflake规范的错误对象,指定错误码、SQL状态和消息 const duplicateError = Snowflake.createError({ errorCode: 'DUPLICATE_RECORD', // 自定义业务错误码 sqlState: '23000', // SQL标准约束违反对应状态码 message: 'This is a duplicate record' }); throw duplicateError; } else { snowflake.execute({ sqlText: `INSERT INTO TEMP2_Table SELECT Id, Name FROM TEMP1_Table;` }); } } catch (err) { throw err; }
关键说明:
sqlState: '23000'是SQL标准中约束违反的通用状态码,完全匹配重复记录插入的场景;errorCode可以自定义为业务易识别的标识,比如DUPLICATE_RECORD,方便后续日志排查;- 使用
Snowflake.createError()生成的错误会被Snowflake正确解析,返回的错误信息中FAIL_CODE、STATE等字段将不再是undefined。
内容的提问来源于stack exchange,提问作者Lochana Liyange
相关产品推荐
相关产品推荐

