我正在处理一个抛出错误和警告的函数. (相关:关于警告的警告)
通常,警告会发生错误.在这些情况下,我想忽略警告并仅处理错误.
另一方面,如果只有一个警告(没有错误),那么我想抓住警告.
我试图使用臭名昭着的易用tryCatch.
我当前的问题是:有没有办法强制tryCatch在errors之前处理warnings(或在出现错误时忽略警告)?
我从?tryCatch文档中得到的理解是条件处理FIFO,在这种情况下,我的直接问题的答案是否 - 至少不是直接的.在这种情况下,是否可以处理警告,然后在仍然捕获错误的同时继续执行该功能?
解决方案不适用于我:
suppressWarnings #我还想抓住并处理警告options(warn=2) #某些警告是无害的Run Code Online (Sandbox Code Playgroud)relevant from `?tryCatch`如果在评估expr时发出条件信号,那么从最近建立的处理程序开始检查已建立的处理程序,以匹配条件的类.当在一个tryCatch中提供多个处理程序时,第一个被认为比第二个更新.如果找到一个处理程序,则控制转移到建立处理程序的tryCatch调用,找到处理程序并解除所有更新的处理程序,以条件作为其参数调用处理程序,并且处理程序返回的结果返回为tryCatch调用的值.
F.errorAndWarning <- function() {
warning("Warning before the error")
cat("I have moved on.")
stop("error")
TRUE
}
F.error <- function() {stop("error"); TRUE}
test <- function(F)
tryCatch(expr= {F}()
, error=function(e) cat("ERROR CAUGHT")
, warning=function(w) cat("WARNING CAUGHT")
)
test(F.error)
# ERROR CAUGHT
test(F.errorAndWarning)
# WARNING CAUGHT
Run Code Online (Sandbox Code Playgroud)
预期/理想输出:
test(F.errorAndWarning)
# ERROR CAUGHT
Run Code Online (Sandbox Code Playgroud) 我正在尝试捕获 R 脚本的完整控制台日志。我想要所有事情的时间顺序,在它们发生时打印警告。我试过这个:
options(warn = 1)
tmpSinkfileName <- tempfile()
sink(tmpSinkfileName, split = TRUE)
cat("Doing something\n")
warning("Hi here")
cat("Doing something else\n")
warning("Hi there")
sink()
console.out <- readChar(tmpSinkfileName, file.info(tmpSinkfileName)$size)
unlink(tmpSinkfileName)
cat(console.out)
# Doing something
# Doing something else
warnings()
# NULL
Run Code Online (Sandbox Code Playgroud)
但不幸的是警告在console.out. 我怎样才能做到这一点?根据文档,options(warn = 1)应该在警告发生时打印警告。不幸的是,他们没有被sink().