0Pricing
Lua Academy · Ders

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: -1

Belirli 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
end

Baş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
end

pcall İç İç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 result

Yö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 divisor

Girdi/Çı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)
end

pcall 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
end

pcall 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 trace

pcall 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)
end

Kısa Kontrol

Korumalı işlev başarılı olduğunda pcall ne döndürür?

Özet: pcall

Özet:

  • pcall(f, ...) → true, results... veya false, 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

  1. error() İşlevi
  2. pcall ile Korumalı Çağrılar
  3. xpcall ve İleti İşleyicileri
  4. Yapılandırılmış Hata Nesneleri
← Lua Academy Sayfasına Dön