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

profvis()包裹代码触发递归错误问题排查求助

问题分析求助:profvis包裹代码时触发递归错误

这段代码在被profvis()包裹运行时会报错:No more error handlers available (recursive errors?); invoking 'abort' restart,但单独运行代码块无此错误。初步怀疑问题与tryCatch()语句相关,求问题原因分析思路。

可复现代码

library(profvis)

n_pred <- c(3,6,12)
pref_prev <- c(0.3, 0.1, 0.01)
scen_temp <- expand.grid(pref_prev = pref_prev, n_pred = n_pred)
par_all <- matrix(NA, nrow = nrow(scen_temp), ncol = 2)
par_init <- matrix(data = c(-1, 0.5,
                            -2.5, 0.5,
                            -5, 0.5,
                            -1, 0.4,
                            -2.5, 0.4,
                            -5, 0.4,
                            -1, 0.3,
                            -2.5, 0.3,
                            -5, 0.3),
                   nrow = 9, ncol = 2, byrow = TRUE)

profvis({

  for (j in 1:nrow(par_all)) {
    
    par_sce <- matrix(NA, 10, 2)
    
    for (k in 1:10){
      par_sce[k,] <- tryCatch({optimB(n_pred = scen_temp[j,2], 
                                      pref_prev = scen_temp[j,1], 
                                      par_init = par_init[j,], 
                                      n = 5000)},
                              error = function(err) {
                                err$message <- paste(err, "Using initial params instead.")
                                par_init[j,]
                              })
    }
    par_all[j,] <- apply(par_sce, 2, median)
  }
})

会话信息

  • R版本:4.2.1 (2022-06-23)
  • 平台:x86_64-apple-darwin17.0 (64-bit)
  • 运行环境:macOS Ventura 13.0.1
  • 矩阵运算:默认
  • LAPACK路径:/Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib
  • 区域设置:en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
  • 已加载基础包:stats、graphics、grDevices、utils、datasets、methods、base
  • 已加载命名空间(未附着):compiler_4.2.1、magrittr_2.0.3、fastmap_1.1.0、cli_3.4.1、tools_4.2.1、rstudioapi_0.14、memoise_2.0.1、cachem_1.0.6、conflicted_1.1.0、rlang_1.0.6、purrr_0.3.5

问题原因分析思路

  • tryCatch错误处理函数触发递归错误:你在错误处理函数中直接修改了err$message,但在profvis的性能分析环境下,err对象可能存在特殊的引用限制,修改操作可能触发新的异常,而新异常又会进入当前tryCatch的处理流程,形成递归,最终耗尽R的错误处理器资源。建议修改错误处理逻辑,不要直接修改原err对象,改为拼接新信息后直接输出,比如:
    error = function(err) {
      message(paste(err$message, "Using initial params instead."))
      par_init[j,]
    }
    
  • profvis的环境隔离干扰:profvis在运行时会创建独立的分析环境,tryCatch错误处理函数中引用的外部变量(如par_init[j,])在该环境下可能无法正常解析,触发二次错误。可以尝试在错误处理函数中先打印变量值,确认是否能正常访问,或者将需要的变量提前通过闭包传入错误处理环境。
  • optimB函数的隐性异常:单独运行时tryCatch能处理optimB的错误,但profvis的profiling钩子可能改变了optimB的错误抛出行为,导致其抛出的错误类型无法被当前tryCatch捕获,进而引发错误溢出。建议先单独测试所有参数组合下optimB的错误情况,确认是否存在特殊异常类型。
  • 错误处理的嵌套逻辑问题:当tryCatch的错误处理函数本身出错时,R会尝试调用上层错误处理器,若没有上层处理器则会触发递归错误提示。可以在外部额外嵌套一层tryCatch,捕获错误处理函数中的异常,定位具体的二次错误点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:55:15