【问题标题】:catching an error and then branching logic捕获错误然后分支逻辑
【发布时间】:2011-01-10 15:43:06
【问题描述】:

如果发生错误情况,如何编写允许我在代码中执行不同路径的 R 代码?我正在使用一个容易引发错误的函数。当它遇到错误条件时,我想执行不同的功能。这是一个具体的例子:

require(SuppDists)
parms <- structure(list(gamma = -0.841109044800762, delta = 0.768672140584442, 
    xi = -0.359199299528801, lambda = 0.522761187947026, type = "SB"), .Names = c("gamma", 
"delta", "xi", "lambda", "type"))
pJohnson(.18, parms)

pJohnson 函数应该失败并出现以下错误:

 Error in pJohnson(0.18, parms) :
 Sb values out of range.

我可以使用以下命令使错误消失:

try( pJohnson(.18, parms), silent=T)

但我真正想做的是在pJohnson(.18, parms) 返回错误时执行函数alternativeFunction()

似乎withCallingHandlers() 函数应该可以帮助我,但我不知道如何捕获错误并使其仅在出现错误情况下运行alternativeFunction()

【问题讨论】:

    标签: r error-handling


    【解决方案1】:
    t <- try(pJohnson(.18, parms))
    if("try-error" %in% class(t)) alternativeFunction()
    

    【讨论】:

    • 显然是我认为“客观”不够的一个例子。感谢您的快速响应!
    • if (inherits(t, "try-error")) alternativeFunction() 是一个不错的选择,它比%in% 更“客观”。
    • 好点。 s3 类的对象抽象层是如此透明,我差点忘了它的存在。
    【解决方案2】:

    另一个选项可能是使用tryCatch 表达式。这是一个例子:

     vari <- 1
     tryCatch(print("passes"),  error = function(e) print(vari)) # => passes
     tryCatch(stop("fails"),  error = function(e) print(vari)) # => 1
    

    你可以在错误块中做任何你想做的事情,所以在你的情况下,这样的事情应该可以工作:

    tryCatch(pJohnson(.18, parms), error=function(e) alternativeFunction())
    

    这并不是错误的真正预期用途,但更简洁一些。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多