如何将异常处理定位到特定的异常?

时间:2017-01-20 12:48:02

标签: r

R是否提供任何支持将异常处理仅针对特定异常?

例如,在Python中,可以将异常处理范围缩小到特定的异常类型; e.g:

try:
    return frobozz[i]
except IndexError:
    return DEFAULT

在此示例中,仅当ii >= len(frobozz)i < -len(frobozz)的整数时才会启动异常处理,但不会捕获例如由此引起的异常i是字符串"0"TypeError,而不是IndexError)。

1 个答案:

答案 0 :(得分:1)

Wellllll ......是和不,而且大多数没有。

每个Python异常都包含在一个特定的错误类中,该类派生自Error,而Python模块应该引发“正确”的错误。例如,索引超出范围错误应抛出IndexError。基本语言知道这些错误,因此您可以在except ...子句中捕获相应的错误类型。

R不这样做。错误是无类型的;索引越界错误与任何其他错误之间没有本质区别。

那就是说,你可以在某些非常有限的情况下作弊。

> y <- tryCatch(x[[2]], error = function(e) e)
> y
<simpleError in x[[2]]: subscript out of bounds>
> y$message
[1] "subscript out of bounds"

这里的关键是使用tryCatch函数和error子句。 tryCatch中的error子句是一个变量的函数,它可以对e执行任意操作,e是'simpleError'类型的对象,并包含一个名为“message”的项。您可以分别解析消息并处理有趣的案例

> y <- tryCatch(x[[2]], 
  error = function(e) {
    if ('subscript out of bounds' == e$message) return(NA) else stop(e))
  })
 > y
 [1] NA

仅当您能够实际检测到要查找的错误字符串时才有效,但这并不能保证。 (然而,在Python中也没有保证,所以事情并没有太大的不同。)

最后一个问题:为什么以天堂的名义你这样做?你真的试图做什么?