Stoppa (direkt)

Defensiv R-programmering

Dr. Colin Gillespie

Jumping Rivers

Jag såg tecknet

Ibland är saker helt enkelt trasiga

  • Vi behöver utlösa ett fel

Till exempel:

1 + "stuff"
Error in 1 + "stuff": non-numeric argument to binary operator
Defensiv R-programmering

Stoppa direkt

För att utlösa ett fel använder vi funktionen stop()

stop("A Euro 1996 error has occurred")
# Error: A Euro 1996 error has occurred
conf_int <- function(mean, std_dev) {
   if(std_dev <= 0) 
       stop("Standard deviation must be positive")

   c(mean - 1.96 * std_dev, mean - 1.96 * std_dev)
}
Defensiv R-programmering

Fånga dem i tid

  • Det går inte att undertrycka (eller ignorera) fel
    • Definitionen av ett fel är att R inte kan fortsätta
    • I stället fångar vi felen

Defensiv R-programmering

Funktionen try()

Funktionen try() fungerar lite som suppress()

res <- try("Scotland" + "World cup", silent = TRUE)

Den försöker köra koden – misslyckas det, fortsätter programmet ändå

Defensiv R-programmering

Mönstret med try()

res <- try("Scotland" + "World cup", silent = TRUE)
res
[1] 'Error in "Scotland" + "World cup": non-numeric argument to binary operator'
attr(,"class")
[1] "try-error"
attr(,"condition")
<simpleError in "Scotland" + "World cup": 
                            non-numeric argument to binary operator>
Defensiv R-programmering

Mönstret med try()

result <- try("Scotland" + "World cup", silent = TRUE)
class(result)
[1] "try-error"
if(class(result) == "try-error")
  ## Do something useful
Defensiv R-programmering

Nu kör vi en övning!

Defensiv R-programmering

Preparing Video For Download...