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)
endW 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.
Wyzwanie
ŁatwyNapisz 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
bwynosi 0, i wywołajerror("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 operandb(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.
endTa 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
1Zaawansowane iterowanie po tabelach
Iterowanie za pomocą pairs()Iterowanie za pomocą ipairs()pairs() a ipairs()Powtórka — karta postaci2Więcej funkcji biblioteki table
table.concat()Tworzenie tabel i unpack()table.sort()Sortowanie niestandardowe za pomocą funkcjiPodsumowanie — tablica najlepszych wyników5Projekt: silnik tekstowej gry przygodowej
Konfiguracja projektu: pokójŁączenie pokoi3Zaawansowane koncepcje funkcji
Zwracanie wielu wartościFunkcje wariadyczne (...)Funkcje jako wartości pierwszej klasyFunkcje anonimoweCzym jest domknięcie?Podsumowanie — prosty obsługiwacz zdarzeń6Obsługa błędów
Funkcja error()Wywołania chronione za pomocą pcall()Podsumowanie — bezpieczne dzieleniePoćwicz samodzielnie: Kompilator Lua online