2014-10-28 102 views
4

为什么下面的代码不会返回2,而是将该警告作为错误处理?tryCatch:为什么警告处理为错误?

tryCatch({ 
    1+1 
    warning("test") 
    return(2) 
}, error=function(e){ 
    print("error") 
}, finally = {}) 

[1] "error" 
Warning message: 
In doTryCatch(return(expr), name, parentenv, handler) : test 

我该如何处理错误,但忽略警告?

+3

不要使用'return'。只要'2'就足够了。 – jbaums 2014-10-28 19:48:42

+1

@jbaums在意识到我的愚蠢之后,我意识到你的建议完全解决了这个问题,因为错误来自于他们使用函数返回。 – Dason 2014-10-28 19:56:12

+0

非常感谢! – Rentrop 2014-10-28 19:58:14

回答

6

当您手动触发warning时,由于您在函数外使用return,因此表达式也会引发错误。

如果您在function(e)返回错误信息本身(而非打印的“错误”),这变得更加明显:(注意,这相当于不包括error参数)

tryCatch({ 
    1+1 
    warning("test") 
    return(2) 
}, error=function(e) { 
    e 
}) 

# <simpleError in doTryCatch(return(expr), name, parentenv, handler): 
# no function to return from, jumping to top level> 
# Warning message: 
# In doTryCatch(return(expr), name, parentenv, handler) : test 

这是,如果你在R控制台输入return(2)你会看到相同的错误消息:

return(2) 
# Error: no function to return from, jumping to top level 

进行补救问题,请从您的表达式中删除return调用,如下所示:

tryCatch({ 
    1+1 
    warning("test") 
    2 
}, error=function(e){ 
    print('error') 
}) 

# [1] 2 
# Warning message: 
# In doTryCatch(return(expr), name, parentenv, handler) : test 
相关问题