我试图理解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
答案 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))
)
注意上面的内容是说明性的,并不是完全健壮的,实际上,您可能希望记录发生的任何条件而不是自动尝试规避问题,但希望这说明自定义条件如何有用给你的用户。