我试图理解 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"...)
下线。我的目标只是能够编写以统一且信息丰富的方式处理错误的函数。
谢谢你的时间。
抢
最佳答案
发出自定义条件的主要优点是您可以让不想修改函数的人知道您的函数是如何失败的。例如,假设您希望您的用户能够对不同类型的故障做出不同的 react 。如果您刚刚使用 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))
)
请注意,上述内容是说明性的,并不意味着完全健壮,实际上,您可能希望记录发生的任何条件而不是自动尝试规避问题,但希望这说明了自定义条件如何对您的用户有用.
关于r - 将 tryCatch 与 s3 自定义错误相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513845/