【问题标题】:sink() doesn't work in tryCatch blocksink() 在 tryCatch 块中不起作用
【发布时间】:2014-10-08 19:59:11
【问题描述】:

我正在尝试在 finally 块中关闭我的记录器实例,如下所示:

logger <- file("all.Rout", open="wt")           
sink(logger, type="message")                                 

tryCatch({
    warning('test')
    message("A")
    log('a')
    message("B")
}, error = function(e) {
}, finally = {
    sink(type="message")
    close(logger)
})

但是,只有message("A") 被保存到日志中,没有其他内容。如果我执行以下操作,问题就解决了:

logger <- file("all.Rout", open="wt")           
sink(logger, type="message")                                 

tryCatch({
    warning('test')
    message("A")
    log('a')
    message("B")
}, error = function(e) {
}, finally = {
})

sink(type="message")
close(logger)

但是,我确实需要在 finally 块中关闭,以便在引发错误时查看日志。

我该如何解决这个问题?

【问题讨论】:

    标签: r logging exception-handling try-catch sink


    【解决方案1】:

    问题在于默认设置是不打印warnings。它们被累积起来,然后在方便时打印。因此,R 认为 finally 块不是打印这些警告的方便时间,因为此时您不是不活跃的并且可能看不到它们。一种解决方法是更改​​设置以在每个警告发生时报告它,而不是等到当前调用完成。你可以这样做

    logger <- file("log.txt", open="wt")           
    sink(logger, type="message")                                 
    
    tryCatch({
        ow<-options(warn=1)
        warning('test')
        message("A")
        log('a')
        message("B")
    }, 
    error = function(e) {
    }, finally = {
        options(ow)
        sink(type="message")
        close(logger)
    })
    

    这里我们在try块的开头更改options(),然后在finally中重置它们。

    然后是日志文件的内容

    Warning in doTryCatch(return(expr), name, parentenv, handler) : test
    A
    

    您会注意到,在另一种方法中,即使警告先出现,消息也会反转。同样,R 只是等到当前调用结束才将警告消息返回给您,那是在 tryCatch() 完成运行之后。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多