pcall() ile Korumalı Çağrılar
Coddy'nin Lua Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 33 / 54.
Bir şeyler ters gittiğinde error() programınızı durdururken, bazen çökmeye neden olmadan hataları işlemek istersiniz. Lua'nın pcall() işlevi, başarısız olabilecek kodları güvenli bir şekilde çalıştırmanızı sağlar.
pcall() adı, “korumalı çağrı” anlamına gelir. Bir işlev çağrısını, hataları yakalayan koruyucu bir katmanla sarar. Programınızın çökmesi yerine, pcall() ne olduğu hakkında bilgi döndürür.
İşte temel sözdizimi:
local status, result = pcall(functionName, arg1, arg2)pcall() işlevi iki değer döndürür. İlki bir boolean durum değeridir: işlev başarıyla çalıştıysa true, bir hata oluştuysa false. İkinci değer duruma bağlıdır; işlem başarılıysa işlevin dönüş değeridir, hata oluştuysa hata mesajıdır.
İşte pratik bir örnek:
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)
endBu örnekte sıfıra bölme bir hatayı tetikler, ancak program çökmek yerine pcall() hatayı yakalar. Program çalışmaya devam eder ve durum değerini kontrol ederek hatayı uygun şekilde işleyebilir.
pcall() çağrının içindeki her hatayı, beklemediğiniz hatalar da dâhil olmak üzere, yakalar ve hepsini aynı şekilde bildirir. Bu yüzden yalnızca başarısız olabilecek çağrıyı sarın ve beklediğiniz başarısızlıklar için önceki derste olduğu gibi nil ve bir ileti döndüren bir işlevi tercih edin.
Görev
Kolay operation, a ve b değerlerini alan ve hesaplama sonucunu ya da bir hata mesajını döndüren safeCalculate adlı bir fonksiyon yaz.
İstenen matematiksel işlemi güvenli bir şekilde gerçekleştirmek için fonksiyon pcall() kullanmalıdır. İşlem dizgesine göre hesaplamayı yapan bir iç fonksiyon oluştur, ardından hataları yakalamak için bu fonksiyonu pcall() ile sar.
Mantık:
- İşlem türünü kontrol eden ve hesaplamayı yapan bir iç fonksiyon oluştur
- "add" için
a + bdöndür - "subtract" için
a - bdöndür - "multiply" için
a * bdöndür - "divide" için
bdeğerinin 0 olup olmadığını kontrol et; doğruysaerror("Division by zero", 0)çağır, değilsea / bdöndür - Diğer tüm işlemler için
error("Invalid operation", 0)çağır - İç fonksiyonu çalıştırmak için
pcall()kullan - İşlem başarılıysa, sonucu izleyen
"Result: "değerini döndür - Bir hata oluşursa, hata mesajını izleyen
"Error: "değerini döndür
error() fonksiyonunun ikinci argümanı olarak 0 geçir. Bu argüman hata düzeyidir ve 0, Lua'ya dosya adını ve satır numarasını mesajının önüne eklememesini söyler; böylece döndürülen dizge tam olarak "Error: Division by zero" olur.
Parametreler:
operation(dizge): Gerçekleştirilecek işlem ("add", "subtract", "multiply" veya "divide")a(sayı): İlk operandb(sayı): İkinci operand
Döndürülen değer: Hesaplama sonucunu izleyen "Result: " ya da hata mesajını izleyen "Error: " değerini içeren bir dizge (dizge)
Kendin dene
function safeCalculate(operation, a, b)
-- Kodu buraya yazın
-- Not: Lua'nın dosya adını ve
-- satır numarasını mesajınızın başına eklememesi için error(message, 0) çağrısını yapın.
endBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Düzey Tablo Yineleme
pairs() ile Yinelemeipairs() ile Yinelemepairs() vs. ipairs()Özet - Karakter Sayfası2Daha Fazla Tablo Kütüphanesi Fonksiyonu
table.concat()Tablo Oluşturma ve unpack()table.sort()Fonksiyonlar ile Özel SıralamaÖzet - Yüksek Skor TablosuKendi başına pratik yap: Online Lua derleyicisi