2016-03-01 2 views
0

Я пытаюсь осуществить вложенную tryCatch в R. Код следующее:Уплотненный Try Поймайте в R

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") 

}) 

Даже если есть ошибка в внутреннем блоке сообщение наружного блока становятся распечатаны. Я хочу, чтобы на выходе, как:

Error in inner block 
Error in outer block 

ответ

2

Я думаю, что у вас есть две проблемы, во-первых, что tryCatch() останавливает выполнение Try-блок, когда происходит ошибка, поэтому второй tryCatch() никогда не выполняется. Вторая проблема заключается в том, что вы, кажется, смешиваете цели try/catch.

В общем, я использую tryCatch() в одном из трех сценариев (1), восстанавливаясь после сбоя, (2) закрывая открытые ресурсы и (3) передавая ошибку с лучшим сообщением об ошибке.

Если вы пытаетесь, чтобы оправиться от неудачи, то лучше включать только один заявление в вашем Ьгу блоке, в противном случае ваш обработчик ошибок должен иметь логику для определения которых ошибки оператора, который может получить уродливые быстро.

tryCatch({ 
    a_statement_that_might_fail() 

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

}) 

Если вам нужно просто нужно лучше сообщения об ошибках или закрыть открытый ресурс, мульти-оператор примерочных блок отлично:

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) 

}) 
+0

Или вы можете добавить 'finally' в' tryCatch' и закройте все соединения в этом заявлении. – Rentrop

+1

Хорошая точка. Я склонен не использовать 'finally', поскольку синтаксически это странный человек: обработчики' warning' и 'error' принимают функции, а' finally' принимает выражение, которое меня отбрасывает, и это редко (но не невозможно) для заявление в try-блоке, чтобы остановить выполнение с помощью чего-либо, кроме ошибки. – Jthorpe

+0

Любая рекомендация, если у вас есть два утверждения, которые не могут быть взаимно успешными? Другими словами, tryCatch - хорошая функция для использования в качестве обобщенного оператора switch/if/else? – Atticus29

0

Вы уверены, ошибка не вызывая одновременно попробуйте блокировать остановку? Это приведет к описанию поведения.

я не был в состоянии воспроизвести проблему, так что здесь положительный пример для работы с:

## Example of nested tryCatch 

# set this variable to 'outer_error', 'outer_warning', 'inner_error', 'inner_warning' or empty ('') to see the different scenarios 
case <- "inner_error" 

result <- "init value" 

tryCatch({ 

    if(case == "outer_error") { 
    stop(simpleError("Whoops: outer error")) 
    } 

    if(case == "outer_warning") { 
    stop(simpleWarning("Whoops: outer warning")) 
    } 

    result <- "first result" 

    tryCatch({ 
    if(case == "inner_error") { 
     stop(simpleError("Whoops: inner error")) 
    } 

    if(case == "inner_warning") { 
     stop(simpleWarning("Whoops: inner warning")) 
    } 

    result <- "Second result!" 
    }, 
    error = function(e) { 
    print(sprintf("Inner error: %s", e)) 
    }, 
    warning = function(e) { 
    print(sprintf("Inner warning: %s", e)) 
    }, 
    finally = { 
    print(sprintf("Inner tryCatch all done, result is %s", result)) 
    }) 
}, 
warning = function (e) { 
    print(sprintf("Outer Warning: %s", e)) 
}, 
error = function(e) { 
    print(sprintf("Outer Error: %s", e)) 
}, 
finally = { 
    print(sprintf("And the result is: %s", result)) 
}) 
Смежные вопросы