BigQuery异常处理仅抛单个错误:如何捕获多存储过程错误?
BigQuery中捕获多个存储过程异常的最优方案
当前代码的问题在于,外层BEGIN...EXCEPTION块会在proc1抛出异常时立即触发,导致proc2根本不会被执行,因此只能捕获到第一个错误。要同时收集两个存储过程的错误,需要为每个存储过程调用单独添加异常捕获逻辑,确保每个调用的错误都被记录,且后续调用不受影响。
以下是最优实现方案:
DECLARE error_list ARRAY<STRUCT<error_msg STRING, query STRING, stack_trace STRING>> DEFAULT []; -- 调用proc1并独立捕获异常 BEGIN CALL my_project.proc1(); EXCEPTION WHEN ERROR THEN SET error_list = ARRAY_CONCAT(error_list, [STRUCT( @@error.message AS error_msg, @@error.statement_text AS query, @@error.formatted_stack_trace AS stack_trace )]); END; -- 调用proc2并独立捕获异常 BEGIN CALL my_project.proc2(); EXCEPTION WHEN ERROR THEN SET error_list = ARRAY_CONCAT(error_list, [STRUCT( @@error.message AS error_msg, @@error.statement_text AS query, @@error.formatted_stack_trace AS stack_trace )]); END; -- 输出所有捕获到的错误信息 SELECT * FROM UNNEST(error_list);
逻辑说明
- 定义
error_list数组变量,用于存储所有捕获到的错误信息,结构与原查询返回字段一致。 - 为每个存储过程调用单独创建
BEGIN...EXCEPTION块,确保单个存储过程报错不会中断后续调用。 - 每个异常块将当前错误以结构体形式追加到
error_list数组中。 - 最后通过
UNNEST展开数组,统一输出所有收集到的错误。
执行上述代码后,会同时返回proc1和proc2的两个除法错误信息。
内容的提问来源于stack exchange,提问作者Peter Yang
相关产品推荐
相关产品推荐

