Menu
Coddy logo textTech

Lever des erreurs avec stop()

Fait partie de la section Logique et flux d’exécution du Journey R de Coddy. Leçon 52 sur 64.

stop("message") déclenche une erreur : la fonction s’arrête immédiatement, rien de ce qui suit ne s’exécute et R affiche le message. Utilisez-le lorsqu’une fonction reçoit une entrée qu’elle ne peut pas traiter :

check_qty <- function(q) {
  if (q <= 0) stop("quantity must be positive")
  q
}
print(check_qty(3))
print(check_qty(-1))
print("never printed")

Sortie :

[1] 3
Error in check_qty(-1) : quantity must be positive
Calls: print -> check_qty
Execution halted

Le texte de l’erreur indique l’appel qui a échoué, et Execution halted signifie que tout le script s’est arrêté : le dernier print() n’a jamais été exécuté. Une erreur est écrite dans le flux d’erreurs, et non dans la sortie normale ; ainsi, sur Coddy, un test échoue lorsqu’une erreur ou un avertissement est affiché.

stopifnot() vérifie plusieurs conditions à la fois et déclenche une erreur pour la première qui vaut FALSE. Une condition nommée utilise son nom comme message :

area <- function(w, h) {
  stopifnot("width must be positive" = w > 0, "height must be positive" = h > 0)
  w * h
}
print(area(2, 3))
print(area(2, -1))

Sortie :

[1] 6
Error in area(2, -1) : height must be positive
Calls: print -> area -> stopifnot
Execution halted

Construisez le message à partir des valeurs avec paste0() ou sprintf(), afin que le lecteur voie ce qui n’allait pas :

get_item <- function(items, i) {
  if (i > length(items)) stop(sprintf("index %d is past the end (%d items)", i, length(items)))
  items[i]
}
print(get_item(c("a", "b"), 5))

Sortie :

Error in get_item(c("a", "b"), 5) : index 5 is past the end (2 items)
Calls: print -> get_item
Execution halted

Levez les erreurs au début d’une fonction, avant qu’un quelconque travail ne soit effectué. Les vérifications qui interrompent rapidement l’exécution gardent le reste de la fonction simple, car celle-ci peut supposer que l’entrée est valide :

withdraw <- function(balance, amount) {
  if (amount <= 0) stop("amount must be positive")
  if (amount > balance) stop("insufficient funds")
  balance - amount
}
challenge icon

Défi

Facile

Complétez make_order(item, qty, stock). Levez une erreur avec stop() :

  • quantity must be at least 1 lorsque qty est inférieur à 1
  • only <stock> left lorsque qty est supérieur à stock, par exemple only 3 left

Sinon, renvoyez ordered <qty> x <item>.

Le code fourni lit l'article, la quantité et le stock, appelle votre fonction et affiche soit son résultat, soit Error: suivi du message d'erreur ; ainsi, aucun test n'affiche jamais le propre texte d'erreur de R.

Essayez vous-même

make_order <- function(item, qty, stock) {
  # Écrivez votre code ici
  ""
}

# Code d'entrée/sortie fourni : gardez-le tel quel
input <- suppressWarnings(readLines(file("stdin")))
result <- tryCatch(make_order(input[1], as.numeric(input[2]), as.numeric(input[3])),
                   error = function(e) paste("Error:", conditionMessage(e)))
cat(result, sep = "\n")
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Logique et flux d’exécution

Entraînez-vous par vous-même : Compilateur R en ligne