我试图理解Hadley Wickham的Advanced 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"...)行下。

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

谢谢你的时间。

最佳答案

发出自定义条件的主要优点是,您可以让不想修改功能的人知道您的功能如何失败。例如,假设您希望用户能够对不同类型的故障做出不同的反应。如果您只是使用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))
)

请注意,以上内容仅是示例性说明,并不意味着完全可靠,实际上,您可能希望记录发生的任何情况,而不会自动尝试规避问题,但是希望这说明了自定义条件如何对用户有用。

09-10 06:47
查看更多