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

将tryCatch与s3自定义错误相结合,r,error-handling,try-catch,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_

我试图理解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" 
)

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

x谢谢。如果我能总结一下这里发生的事情:谢谢。因此,如果我可以总结一下这里发生的事情:my_log(x)函数创建一些自定义条件,如果在“tryCatch”类型代码以外的任何代码中调用它,这些条件将显示给调用函数(或控制台)。但是,当从“tryCatch”函数调用“my_log”函数时,“tryCatch”代码决定如何处理它。您的意思是,tryCatch虽然可以决定如何处理错误和警告,但它更适合于日志记录条件,而不是修复它们,因为您的代码可能会遗漏一些更深层次的错误。@robertedwarbon,是的。代码可以做的不仅仅是日志记录(并且非常适合于此),但是除了它所做的任何事情之外,可能还应该进行日志记录,除非严格记录了条件是问题的条件。