将tryCatch与s3自定义错误相结合
我试图理解Hadley Wickham的高级R章节“异常和调试”中给出的示例 下面是示例代码:将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_
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,是的。代码可以做的不仅仅是日志记录(并且非常适合于此),但是除了它所做的任何事情之外,可能还应该进行日志记录,除非严格记录了条件是问题的条件。