Menu
CoddyTech

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 z ochroną”. 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, albo false, jeśli wystąpił błąd. Druga wartość zależy od statusu: jeśli funkcja zakończyła się powodzeniem, jest to jej wartość zwracana; 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 powoduje błąd, ale zamiast awarii programu przechwytuje go pcall(). Program działa dalej i może łagodnie obsłużyć błąd, sprawdzając wartość statusu.

Pamiętaj, że pcall() przechwytuje każdy błąd występujący wewnątrz wywołania, w tym nieoczekiwane błędy w kodzie, i zgłasza je wszystkie w ten sam sposób. Obejmuj więc nim tylko wywołanie, które może się nie powieść, a w przypadku spodziewanych błędów preferuj funkcję zwracającą nil i komunikat, tak jak w poprzedniej lekcji.

challenge icon

Wyzwanie

Łatwy

Napisz funkcję safeCalculate, która przyjmuje operation, a i b oraz 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 ciągu 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, i wywołaj error("Division by zero", 0), jeśli tak jest; 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 następnie wynik
  • Jeśli wystąpi błąd, zwróć "Error: ", a następnie 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 zwracany ciąg znaków będzie dokładnie równy "Error: Division by zero".

Parametry:

  • operation (ciąg znaków): operacja do wykonania ("add", "subtract", "multiply" lub "divide")
  • a (liczba): pierwszy operand
  • b (liczba): drugi operand

Wartość zwracana: Ciąg znaków zawierający albo "Result: ", a następnie wynik obliczenia, albo "Error: ", a następnie komunikat o błędzie (ciąg znaków)

Spróbuj swoich sił

function safeCalculate(operation, a, b)
    -- Napisz tutaj kod
    -- 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