【问题标题】:tryCatch passthrough with handled warning带有已处理警告的 tryCatch 直通
【发布时间】:2021-11-01 15:02:36
【问题描述】:

有没有办法让tryCatchwarning 参数传递expr 的结果,即使有已处理的警告?

r <- tryCatch(
  {
     warning("I'm a warning!")
     return(100) # I want the return value of the tryCatch to be this!
  },
  warning = function(w) {
    # send a notification with the warning message 
  }
)

r 的结果应该是 100!

【问题讨论】:

    标签: r


    【解决方案1】:

    tryCatch 不这样做:每个处理程序都会中断表达式的执行并立即返回给调用者。

    相反,这是withCallingHandlers 的任务,它处理一个条件,然后将控制权返回给表达式。

    这是一个例子:

    f = function () {
        warnings = list()
        self = environment()
    
        r = withCallingHandlers({
                warning("I'm a warning!")
                100
            },
            warning = function (w) {
                self$warnings = c(self$warnings, conditionMessage(w))
                invokeRestart('muffleWarning')
            }
        )
    
        list(r = r, warnings = warnings)
    }
    

    当我们运行它时,结果如下:

    f()
    # $r
    # [1] 100
    #
    # $warnings
    # $warnings[[1]]
    # [1] "I'm a warning!"
    

    请注意,您不能在此处使用return()It’s usually redundant anyway 但在这个特定的上下文中,它会中止f 的执行,所以r 永远不会被赋值,函数的其余部分也不会被执行。 p>

    顺便说一句,invokeRestart('muffleWarning') 不是必需的;它禁止将警告打印到标准错误流的默认处理程序;您可以删除它,调用将以相同的方式工作,但还会打印警告。您可以通过withRestarts 安装自己的重启。

    R 中的条件系统非常强大,但也非常复杂,不幸的是,文档基本上不存在。我所知道的最好的资源是 Advanced R 中的 Conditions chapter,以及改编自 Lisp 的文章 Beyond Exception Handling: Conditions and Restarts,虽然 (恕我直言) 不太平易近人,但更从根本上解释了这些概念。

    【讨论】:

      猜你喜欢
      • 2013-10-26
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-24
      相关资源
      最近更新 更多