Menu
Coddy logo textTech

Zgłaszanie błędów za pomocą stop()

Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 52 z 64.

stop("message") zgłasza błąd: funkcja natychmiast się zatrzymuje, nic, co znajduje się po niej, nie zostaje uruchomione, a R wyświetla komunikat. Użyj jej, gdy funkcja otrzyma dane wejściowe, z którymi nie może pracować:

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

Wynik:

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

Tekst błędu podaje nazwę wywołania, które się nie powiodło, a Execution halted oznacza, że cały skrypt został zatrzymany: ostatnie print() nigdy się nie wykonało. Błąd jest zapisywany do strumienia błędów, a nie do standardowego wyjścia, dlatego w Coddy test kończy się niepowodzeniem, gdy zostanie wypisany jakikolwiek błąd lub ostrzeżenie.

stopifnot() sprawdza kilka warunków jednocześnie i zgłasza błąd dla pierwszego warunku, który ma wartość FALSE. Nazwany warunek używa swojej nazwy jako komunikatu:

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

Wynik:

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

Zbuduj komunikat z wartości za pomocą paste0() lub sprintf(), aby czytelnik zobaczył, co poszło nie tak:

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

Wynik:

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

Zgłaszaj błędy na początku funkcji, zanim zostanie wykonana jakakolwiek praca. Kontrole, które wcześnie przerywają działanie, upraszczają resztę funkcji, ponieważ można założyć, że dane wejściowe są prawidłowe:

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

Wyzwanie

Łatwy

Uzupełnij make_order(item, qty, stock). Zgłoś błąd za pomocą stop():

  • quantity must be at least 1, gdy qty jest mniejsze niż 1
  • only <stock> left, gdy qty jest większe niż stock, na przykład only 3 left

W przeciwnym razie zwróć ordered <qty> x <item>.

Dostarczony kod odczytuje produkt, ilość i stan magazynowy, wywołuje Twoją funkcję i wyświetla jej wynik albo Error: , po którym następuje komunikat o błędzie, więc żaden test nigdy nie wyświetla własnego komunikatu o błędzie R.

Spróbuj swoich sił

make_order <- function(item, qty, stock) {
  # Napisz tutaj swój kod
  ""
}

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator R online