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