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

标签 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_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/

相关文章:

r - logLik.lm() : Why does R use (p + 1) instead of p for degree of freedom?

php - 如何在 PHP 中获取有用的错误消息?

cakephp - Cake PHP异常错误

try-catch - 在 Cython 中尝试 cimport 语句(与 mpi4py 一起使用)

c# - 这个 try-catch block 有效吗?

sql-server - 何时需要在 try catch block 中检查 @@trancount > 0 ?

r - 将一个数据帧中的数据匹配到另一个数据帧

R apply 函数返回日期变量的数值

r - 如何更改R中所有用户的文件权限

iphone - CGBitmapContextCreate的处理错误