Menu
Coddy logo textTech

Wywołania chronione za pomocą pcall()

Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 33 z 54.

Podczas gdy error() zatrzymuje program, gdy coś pójdzie nie tak, czasami chcesz obsługiwać błędy bez awarii programu. Funkcja pcall() w Lua pozwala bezpiecznie wykonywać kod, który może zakończyć się niepowodzeniem.

Nazwa pcall() oznacza „wywołanie chronione”. Otacza wywołanie funkcji warstwą ochronną, która przechwytuje wszelkie błędy. Zamiast awarii programu, pcall() zwraca informacje o tym, co się stało.

Oto podstawowa składnia:

local status, result = pcall(functionName, arg1, arg2)

Funkcja pcall() zwraca dwie wartości. Pierwsza to status logiczny: true, jeśli funkcja zakończyła się powodzeniem, lub false, jeśli wystąpił błąd. Druga wartość zależy od statusu: jeśli funkcja zakończyła się powodzeniem, jest to zwracana przez nią wartość; jeśli wystąpił błąd, jest to komunikat o błędzie.

Oto praktyczny przykład:

function divide(a, b)
    if b == 0 then
        error("Cannot divide by zero")
    end
    return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
    print("Result: " .. result)
else
    print("Error caught: " .. result)
end

W tym przykładzie dzielenie przez zero wywołuje błąd, ale zamiast się zawiesić, pcall() go przechwytuje. Program działa dalej i może obsłużyć błąd w kontrolowany sposób, sprawdzając wartość statusu.

challenge icon

Wyzwanie

Łatwy

Napisz funkcję safeCalculate, która przyjmuje operation, a i b, a następnie zwraca wynik obliczenia lub komunikat o błędzie.

Funkcja powinna używać pcall(), aby bezpiecznie wykonać żądaną operację matematyczną. Utwórz funkcję wewnętrzną, która wykonuje obliczenie na podstawie łańcucha znaków określającego operację, a następnie opakuj ją w pcall(), aby przechwytywać błędy.

Logika:

  • Utwórz funkcję wewnętrzną, która sprawdza typ operacji i wykonuje obliczenie
  • Dla "add" zwróć a + b
  • Dla "subtract" zwróć a - b
  • Dla "multiply" zwróć a * b
  • Dla "divide" sprawdź, czy b wynosi 0. Jeśli tak, wywołaj error("Division by zero", 0), w przeciwnym razie zwróć a / b
  • Dla każdej innej operacji wywołaj error("Invalid operation", 0)
  • Użyj pcall(), aby wykonać funkcję wewnętrzną
  • Jeśli operacja się powiedzie, zwróć "Result: ", a po nim wynik
  • Jeśli wystąpi błąd, zwróć "Error: ", a po nim komunikat o błędzie

Przekaż 0 jako drugi argument funkcji error(). Ten argument określa poziom błędu, a 0 informuje Lua, aby nie umieszczał nazwy pliku i numeru wiersza przed komunikatem, dzięki czemu zwrócony łańcuch znaków będzie dokładnie równy "Error: Division by zero".

Parametry:

  • operation (łańcuch znaków): Operacja do wykonania ("add", "subtract", "multiply" lub "divide")
  • a (liczba): Pierwszy operand
  • b (liczba): Drugi operand

Zwraca: Łańcuch znaków zawierający albo "Result: ", po którym następuje wynik obliczenia, albo "Error: ", po którym następuje komunikat o błędzie (łańcuch znaków)

Spróbuj swoich sił

function safeCalculate(operation, a, b)
    -- Napisz kod tutaj
    -- Uwaga: wywołaj error(message, 0), aby Lua nie dodawała nazwy pliku ani
    -- numeru wiersza przed Twoim komunikatem.
end
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 programu

Poćwicz samodzielnie: Kompilator Lua online