pcall ile Korumalı Çağrılar
Hataları pcall kullanarak güvenle yakalayın ve dönüş değerlerini yorumlayın.
pcall ile Korumalı Çağrılar, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.
pcall Temelleri
pcall(f, ...), f işlevini ... bağımsız değişkenleriyle korumalı kipte çağırır. f başarılı olursa pcall, ardından tüm dönüş değerleri gelecek şekilde true döndürür. f hata verirse pcall, ardından hata mesajı gelecek şekilde false döndürür. Program her iki durumda da çalışmaya devam eder.
local function risky(x)
if x < 0 then error("negative input: " .. x) end
return math.sqrt(x)
end
local ok, result = pcall(risky, 9)
print(ok, result) -- true 3.0
ok, result = pcall(risky, -1)
print(ok, result) -- false ...: negative input: -1Belirli Hataları Yakalama
Farklı hata türlerini farklı biçimlerde işlemek için pcall sonrasında hata değerinin türünü denetleyin. Tablo türündeki hatalar yapılandırılmış veriler, dize türündeki hatalar ise bir mesaj içerir. Her iki durumu da her zaman ele alın.
local function op(errType)
if errType == "table" then
error({code=42, msg="structured error"})
else
error("plain string error")
end
end
local ok, err = pcall(op, "table")
if not ok then
if type(err) == "table" then
print("Code:", err.code, "Msg:", err.msg)
else
print("String error:", err)
end
endBaşarılı Durumda Birden Çok Dönüş Değeri
Başarılı olduğunda pcall, başlangıçtaki true değerinden sonra korunan işlevin tüm dönüş değerlerini döndürür. Bunları birden çok değişkenle yakalayın.
local function compute(a, b)
return a + b, a * b, a - b
end
local ok, sum, product, diff = pcall(compute, 6, 4)
if ok then
print("sum:", sum, "product:", product, "diff:", diff)
-- sum: 10 product: 24 diff: 2
endpcall İç İçe Kullanımı
pcall çağrıları iç içe kullanılabilir. Her pcall bağımsız bir korumalı kapsam oluşturur. İçteki pcall içindeki bir hata dıştaki pcall tarafından değil, içteki pcall tarafından yakalanır. Bu sayede geri dönüş stratejileri uygulayabilirsiniz.
local function tryPrimary()
error("primary failed")
end
local function tryFallback()
return "fallback result"
end
local ok, result = pcall(tryPrimary)
if not ok then
print("Primary failed:", result)
ok, result = pcall(tryFallback)
end
if ok then print("Got:", result) end -- fallback resultYöntemlerle pcall Kullanımı
Bir yöntemi (iki nokta üst üste söz dizimiyle) pcall aracılığıyla çağırmak için işlevi ve nesneyi ilk bağımsız değişken olarak geçirin. pcall(obj.method, obj, args...) kullanabilir veya bir kapatma içine sarabilirsiniz.
local obj = {
x = 10,
compute = function(self, n)
if n == 0 then error("zero divisor") end
return self.x / n
end
}
-- Pass method + self explicitly
local ok, v = pcall(obj.compute, obj, 2)
print(ok, v) -- true 5.0
-- Or use a closure
ok, v = pcall(function() return obj:compute(0) end)
print(ok, v) -- false ...zero divisorGirdi/Çıktı Güvenliği için pcall
Beklenmeyen OS hatalarını yakalamak için girdi/çıktı işlemlerini pcall içine sarın. Çağıranların başarısızlıkları düzgünce ele alabilmesi için tutarlı bir sonuç/hata çifti döndürün.
local function safeRead(path)
local ok, result = pcall(function()
local f = assert(io.open(path, "r"))
local content = f:read("a")
f:close()
return content
end)
if ok then return result
else return nil, result
end
end
local data, err = safeRead("config.txt")
if data then print("Read", #data, "bytes")
else print("Error:", err)
endpcall ile Yeniden Deneme Örneği
Kararsız bir işlemi (ağ isteği veya dosya yazma gibi) pcall kullanarak en fazla N kez yeniden deneyin. Gerçek kodda yeniden denemeler arasında bekleyin (veya eş yordamları kullanın).
local function retry(fn, maxAttempts)
local attempts = 0
while attempts < maxAttempts do
attempts = attempts + 1
local ok, result = pcall(fn)
if ok then
print("Succeeded on attempt", attempts)
return result
end
print("Attempt", attempts, "failed:", result)
end
error("all " .. maxAttempts .. " attempts failed")
end
local n = 0
retry(function()
n = n + 1
if n < 3 then error("not ready") end
return "done"
end, 5)pcall Sonuçlarını Tabloda Tutma
pcall bir döngüde kullanıldığında, sonuçları daha sonra incelemek üzere bir tabloda saklayın. Bu, ilk başarısızlıkta durmak yerine tüm öğeleri işlemek ve hataları toplamak istediğiniz toplu işlemler için kullanışlıdır.
local jobs = {10, -5, 25, 0, 16}
local results = {}
for _, n in ipairs(jobs) do
local ok, v = pcall(function()
if n < 0 then error("negative") end
return math.sqrt(n)
end)
results[#results+1] = {input=n, ok=ok, value=v}
end
for _, r in ipairs(results) do
if r.ok then
print(r.input, "->", string.format("%.3f", r.value))
else
print(r.input, "-> ERROR:", r.value)
end
endpcall ve xpcall Karşılaştırması
pcall hatayı yakalar, ancak size yalnızca hata değerini verir. xpcall ise yığın hâlâ bozulmamışken çalışan bir mesaj işleyicisi işlevi sağlamanıza olanak tanır ve böylece yığın izlemeleri oluşturabilirsiniz. Yığın izlemelerine ihtiyacınız olduğunda xpcall seçin.
-- pcall: simple, no traceback
local ok1, err1 = pcall(function()
error("simple error")
end)
print(err1) -- only the error message
-- xpcall: with traceback handler
local ok2, err2 = xpcall(
function() error("traced error") end,
function(e) return debug.traceback(e, 2) end
)
print(err2) -- full stack tracepcall Dönüş Kuralı
Tutarlı bir API'nin temelini oluşturmak için pcall kullanın: başarılı durumda her zaman value, başarısız durumda ise nil, errorMessage döndürün. İşlevlerinizi bu şekilde katmanlandırarak çağıranların her zaman ne bekleyeceğini bilmesini sağlayın.
local function loadJSON(path)
local ok, result = pcall(function()
local f = assert(io.open(path, "r"))
local text = f:read("a")
f:close()
-- Fake JSON parse for demo
return {data = text, path = path}
end)
if ok then return result
else return nil, result
end
end
local data, err = loadJSON("data.json")
if data then print("Loaded:", data.path)
else print("Failed:", err)
endKısa Kontrol
Korumalı işlev başarılı olduğunda pcall ne döndürür?
Özet: pcall
Özet:
pcall(f, ...)→true, results...veyafalse, err- Başarıyı ya da başarısızlığı belirlemek için ilk dönüş değerini denetleyin
- Başarılı durumda true değerinden sonra birden çok dönüş değeri gelir
- İç içe pcall: her biri kendi hatalarını bağımsız olarak yakalar
- Yeniden deneme örüntüsü: kararsız işlemler için pcall içeren döngü kullanın
- Yığın izlemelerine ihtiyacınız olduğunda xpcall kullanın
Sıkça Sorulan Sorular
“pcall ile Korumalı Çağrılar” dersi ücretsiz mi?
Evet — “pcall ile Korumalı Çağrılar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.
“pcall ile Korumalı Çağrılar” dersinde ne öğreneceğim?
Hataları pcall kullanarak güvenle yakalayın ve dönüş değerlerini yorumlayın. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Lua Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“pcall ile Korumalı Çağrılar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- error() İşlevi
- pcall ile Korumalı Çağrılar
- xpcall ve İleti İşleyicileri
- Yapılandırılmış Hata Nesneleri