将tryCatch与s3自定义错误相结合

时间:2014-12-16 21:01:54

标签: r error-handling try-catch

我试图理解Hadley Wickham的高级R章节“异常和调试”中给出的例子

以下是示例代码:

condition <- function(subclass, message, call = sys.call(-1), ...) {
    structure(
        class = c(subclass, "condition"),
        list(message = message, call = call),
        ...)
    }

custom_stop <- function(subclass, message, call = sys.call(-1), ...) {
    c <- condition(c(subclass, "error"), message, call = call, ...)
    stop(c)
    }

my_log <- function(x) {
    if (!is.numeric(x))
        custom_stop("invalid_class", "my_log() needs numeric input")
    if (any(x < 0))
        custom_stop("invalid_value", "my_log() needs positive inputs")
    log(x)
}

tryCatch(
    my_log("a"),
    invalid_class = function(c) "class",
    invalid_value = function(c) "value" 
)

Wickham说:“然后,您可以使用tryCatch()针对不同类型的错误采取不同的行动。”

但这里的tryCatch陈述有什么意义呢?

如果我希望my_log函数将负值变为正值,则返回日志,我可以将相关代码放在custom_stop("invalid_value"...)行下。

我的目标是能够以统一和信息丰富的方式编写处理错误的函数。

感谢您的时间。

Rob

1 个答案:

答案 0 :(得分:0)

发出自定义条件的关键优势在于,让不想修改功能的人知道您的功能失败了。例如,假设您希望您的用户能够对不同类型的故障做出不同的反应。如果您刚刚使用stop,他们将无法以编程方式确定失败的性质。

例如,我可以编写如下代码:

x <- "1.1"
tryCatch(
  my_log(x),
  invalid_class=function(c) my_log(as.numeric(x)),
  invalid_value=function(c) my_log(abs(x))
)

注意上面的内容是说明性的,并不是完全健壮的,实际上,您可能希望记录发生的任何条件而不是自动尝试规避问题,但希望这说明自定义条件如何有用给你的用户。