带有变量赋值的`tryCatch`

梅菲特

我正在尝试运行一个函数,但了解它是否成功完成、发出错误或警告,我尝试执行以下操作:

ret <- 0 

tryCatch(expr = {
  cat(non_existing_variable, "\n")
  },
  error = function(e) {
    ret <- 1
    cat("Got into error condition!\n")
  },
  warning = function(w) {
    ret <- 2
    cat("Got into warning condition!\n")
  }
)

cat("ret =", ret, "\n")

但它打印:

Got into error condition!
ret = 0 

我预计它会屈服ret = 1

这里发生了什么?

艾伦·卡梅伦

ret变量被分配在不同的范围内tryCatch如果要在父框架中分配,可以在此处<<-使用运算符进行分配ret

ret <- 0 

tryCatch(expr = {
  cat(non_existing_variable, "\n")
  },
  error = function(e) {
    ret <<- 1
    cat("Got into error condition!\n")
  },
  warning = function(w) {
    ret <<- 2
    cat("Got into warning condition!\n")
  }
)
#> Got into error condition!

cat("ret =", ret, "\n")
#> ret = 1

然而,为了避免调用框架中的意外分配,一个更好的方法是让捕获的错误显式返回:

ret <- tryCatch(expr = {
  cat(non_existing_variable, "\n")
  return(0)
  },
  error = function(e) {
    
    cat("Got into error condition!\n")
    return(1)
  },
  warning = function(w) {
    cat("Got into warning condition!\n")
    return(2)
  }
)
#> Got into error condition!

cat("ret =", ret, "\n")
#> ret = 1

reprex 包于 2022-06-15 创建(v2.0.1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有“:”的python变量赋值

带有未赋值变量的 Python 函数

带有 If 语句的 C++ 变量赋值

用于插入的 PHP MySQL 查询,带有连接赋值变量

带有jQuery选择器的变量赋值中的Javascript OR运算符

带有默认值的Swift可选变量赋值(双问号)

Thymeleaf th:带有条件的局部变量赋值

内存如何在带有变量赋值的c#中工作?

如果给一个带有两个加号的变量赋值是什么意思?

tryCatch似乎没有返回我的变量

变量赋值没有赋值给变量——我做错了什么?

使用 aspectj 拦截带有反射的赋值

带有“let”的 Bash 赋值失败,带有“/”

在 R 中使用带有 Magrittr 管道的 tryCatch

带有变量的NSTimer

MySQL 变量赋值没有赋值给变量——我做错了什么?

带有匿名/箭头函数回调的赋值速记

带有If +赋值的ASM COMPUTE_FRAMES错误

ES2015:如何简化带有赋值的if语句?

带有赋值表达式的意外结果

将带有赋值的循环转换为理解

带有赋值操作的奇怪 while 循环 C++

我可以跳过带有`list`赋值的数组元素吗?

Babel中带有赋值的Javascript对象分解

带有 Sequelize 的加法和减法赋值运算符

带有赋值运算符的类的C ++深层复制

变量值在结构赋值后打印和没有结构赋值打印时是不同的

为什么条件变量赋值设置一个值,而标准赋值却没有?

在Flutter StatefulWidget中为initState内的变量赋值或不赋值之间有什么区别?