R 中的嵌套 Try Catch

Him*_*Rai 4 r

我正在尝试在 R 中实现嵌套的 tryCatch 。代码如下:

tryCatch({
    a <- 2/'a'
    print(a)
    print("himanshu")

    tryCatch({
        a <- 3/'a'
        print(a)
        print("inner loop") 

    }, warning = function(war) {
        print("Warning in inner tryCAtch")

    },  error = function(err) {
        print("Error in inner tryCAtch")
    })

 }, warning = function(war) {
        print("Warning in outer tryCAtch")

 }, error = function(err) {
    print("Error in outer tryCAtch")

 })
Run Code Online (Sandbox Code Playgroud)

即使内部块中有错误,外部块的消息也会被打印。我想要的输出如下:

Error in inner block
Error in outer block
Run Code Online (Sandbox Code Playgroud)

Jth*_*rpe 5

我认为你有两个问题,第一是 tryCatch() 在发生错误时停止执行 try 块,因此第二个 tryCatch() 永远不会执行。第二个问题是你似乎混合了 try/catch 的目的。

一般来说,我在以下三种情况之一中使用 tryCatch():(1) 从故障中恢复,(2) 关闭打开的资源,以及 (3) 使用更好的错误消息传递错误。

如果您尝试从失败中恢复,最好在 try 块中只包含一个语句,否则您的错误处理程序必须具有识别哪个语句失败的逻辑,这可能会很快变得丑陋。

tryCatch({
    a_statement_that_might_fail()

},error = function(err){
    recover from failure here

})
Run Code Online (Sandbox Code Playgroud)

如果您只需要更好的错误消息或关闭开放资源,那么多语句 try 块就可以了:

resource  <-  open_file_or_database()
tryCatch({
    lots()
    of()
    statements()
    that()
    might()
    fail()

},error = function(err){
    stop(sprintf('Got this error: %s',err$message)) 

},finally={
    close(resource)

})
Run Code Online (Sandbox Code Playgroud)