Search code examples
rtry-catch

`tryCatch` with variable assignment


I'm trying to run a function but get some knowledge of whether or not it completed successfully, issued an error or a warning, I've tried doing the following:

ret <- 0 

tryCatch(expr = {
  cat(non_existing_variable, "\n")
  },
  error = function(e) {
    ret <- 1
    cat("Got into error condition!\n")
  },
  warning = function(w) {
    ret <- 2
    cat("Got into warning condition!\n")
  }
)

cat("ret =", ret, "\n")

But it prints:

Got into error condition!
ret = 0 

I expected it to yield ret = 1.

What is happening here?


Solution

  • The ret variable is being assigned in a different scope inside tryCatch. You could use the <<- operator for assignment here if you want ret to be assigned in the parent frame:

    ret <- 0 
    
    tryCatch(expr = {
      cat(non_existing_variable, "\n")
      },
      error = function(e) {
        ret <<- 1
        cat("Got into error condition!\n")
      },
      warning = function(w) {
        ret <<- 2
        cat("Got into warning condition!\n")
      }
    )
    #> Got into error condition!
    
    cat("ret =", ret, "\n")
    #> ret = 1
    

    However, an even better way to do this to avoid unexpected assignments in the calling frame would be to get the caught error to explicitly return:

    ret <- tryCatch(expr = {
      cat(non_existing_variable, "\n")
      return(0)
      },
      error = function(e) {
        
        cat("Got into error condition!\n")
        return(1)
      },
      warning = function(w) {
        cat("Got into warning condition!\n")
        return(2)
      }
    )
    #> Got into error condition!
    
    cat("ret =", ret, "\n")
    #> ret = 1
    

    Created on 2022-06-15 by the reprex package (v2.0.1)