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

子函数报错致流程终止,如何实现所有子函数完整执行?

问题:子函数报错导致整个更新流程终止的解决方案

问题原因分析

主函数Update_SP_Request_Lists依次调用多个子函数,但当前实现存在以下导致流程终止的问题:

  • 子函数错误处理的潜在泄漏:虽然子函数内部有错误捕获,但如果子函数的错误处理逻辑(比如发送告警邮件)本身触发错误,未被捕获的错误会冒泡到主函数,导致整个流程终止。
  • 全局变量风险:子函数中使用全局变量strTFlag控制事务状态,若某个子函数出错后未正确重置该变量,后续子函数的事务处理会出现异常,进而终止流程。
  • 主函数无错误隔离机制:主函数未对每个子函数调用做错误隔离,一旦子函数抛出未捕获的错误,整个调用链会直接终止。

解决方案

1. 为主函数添加子函数级别的错误隔离

修改主函数,对每个子函数调用单独添加错误捕获,确保单个子函数出错不影响后续执行:

Public Function Update_SP_Request_Lists()
    '::-- Initialize --::'
    Call Initialize_Global_Content
    
    '::-- Purge Tables --::'
    If strEnvType <> "[PROD]" Then 
        On Error Resume Next
        Call Purge_Table_Contents
        On Error GoTo 0
    End If
            
    'Run all Functions with error isolation
    On Error Resume Next
    Call Update_rdInvestments
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_rdAssets
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_rdTarget
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_rdActivity
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_rdPlatIntInfa
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_Indications
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_rdDevice
    On Error GoTo 0
    
    On Error Resume Next
    Call Update_rdPPStarget
    On Error GoTo 0
End Function

2. 子函数优化:使用局部事务变量,避免全局冲突

将子函数中的全局变量strTFlag改为局部变量,防止跨子函数的状态干扰:

修改Update_rdActivity中的事务控制部分:

Public Function Update_rdActivity()
'::-- Error Handler --::'
On Error GoTo Proc_Err
    
    '::-- Initialize --::'
    Call Initialize_Global_Content
    
    Dim db As DAO.Database
    Dim ws As DAO.Workspace
    ' 将strTFlag改为局部变量
    Dim blnInTransaction As Boolean 
    
    ' ... 其他变量声明保持不变 ...
    
    Set ws = DBEngine.Workspaces(0)
    Set db = ws.Databases(0)
    
    'Start a transaction to ensure all updates are run or rolled back
    ws.BeginTrans
    blnInTransaction = True ' 使用局部变量标记事务状态
    
    ' ... 中间业务逻辑保持不变 ...
    
    'commit all changes
    ws.CommitTrans
    blnInTransaction = False
    
Proc_Exit:
    ' ... 其他清理代码保持不变 ...
    
    Exit Function

Proc_Err:
    '::-- Rollback Transaction --::'
    If blnInTransaction Then 
        On Error Resume Next ' 防止回滚本身出错
        ws.Rollback
        On Error GoTo 0
    End If
    
    ' ... 错误捕获和告警逻辑保持不变 ...
    
    Err.Clear ' 清除错误状态,防止传递到主函数
    Resume Proc_Exit
End Function

3. 增强子函数错误处理的鲁棒性

在子函数的Proc_Err块末尾添加Err.Clear,确保错误状态被完全清除,避免错误传递到主函数。

关键说明

  • On Error Resume Next + On Error GoTo 0的组合可以实现对子函数调用的错误隔离,既捕获错误,又不影响后续代码执行。
  • 使用局部变量控制事务状态,彻底避免全局变量带来的跨函数状态污染问题。
  • 子函数内部清除错误状态,确保即使子函数出错,也不会将错误状态传递到主函数,保证主函数流程继续。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:59:55