0Pricing
Lua Academy · Ders

xpcall ve İleti İşleyicileri

Ayrıntılı hata geri izlemeleri için xpcall'ı özel bir işleyiciyle kullanın.

xpcall ve İleti İşleyicileri, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 3. 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.

xpcall Söz Dizimi

xpcall(f, handler, ...), f işlevini ... bağımsız değişkenleriyle korumalı kipte çağırır; hata oluşursa handler(errorObject) çağrılır. İşleyicinin dönüş değeri, xpcall'ın ikinci dönüş değeri olur. pcall'dan farklı olarak xpcall, yığın bozulmamışken işleyiciyi çalıştırır.

local function handler(err)
  return "HANDLED: " .. tostring(err)
end

local ok, msg = xpcall(
  function() error("something bad") end,
  handler
)

print(ok)   -- false
print(msg)  -- HANDLED: ...: something bad

İşleyici Olarak debug.traceback

En yaygın xpcall işleyicisi debug.traceback'tir. Bunu doğrudan işleyici olarak geçirin; hata mesajını tam bir çağrı yığını izlemesiyle biçimlendirir ve üretim ortamındaki hataların ayıklanmasında çok değerlidir.

local function level3() error("deep error") end
local function level2() level3() end
local function level1() level2() end

local ok, err = xpcall(level1, debug.traceback)

if not ok then
  -- err contains the full stack trace
  print(err)
end

Bağlam İçeren Özel İşleyici

Özel bir işleyici bağlam ekleyebilir: zaman damgası ekleyebilir, dosyaya günlük kaydı yazabilir, izleme sistemlerine bildirim gönderebilir ve ardından biçimlendirilmiş hatayı döndürebilir. Bu, Lua uygulamalarında üretim ortamı hata işlemenin standart örüntüsüdür.

local function errorHandler(err)
  local trace = debug.traceback(err, 2)
  local ts = os.date("%H:%M:%S")
  local report = string.format("[%s] ERROR\n%s", ts, trace)
  -- Could log to file here
  io.stderr:write(report .. "\n")
  return report
end

local ok, msg = xpcall(
  function()
    local t = nil
    return t.field   -- error!
  end,
  errorHandler
)
print("ok:", ok)

İşleyici Hata Veremez

Mesaj işleyicisinin kendisi bir hata fırlatırsa Lua, işleyiciyi yeniden çağırmadan bir hata göstergesi döndürür. İşleyicileri her koşulda çalışacak şekilde yazın: başarısız olabilecek girdi/çıktı işlemleri yapmayın ve nil değerleri indislemeyin.

local function safeHandler(err)
  -- Keep handler simple and safe
  local ok, trace = pcall(debug.traceback, err, 2)
  if ok then return trace
  else return tostring(err) .. " (traceback failed)"
  end
end

local ok, msg = xpcall(
  function() error({complex="error table"}) end,
  safeHandler
)
print(ok, type(msg))

Ana Döngü için xpcall

Uzun süre çalışan programlarda (sunucular veya oyun döngüleri gibi), işlenmemiş hataları yakalayıp günlüğe kaydetmek ve çökme yaşanmasını önlemek için ana işlevi xpcall içine sarın. Ana döngü daha sonra yeniden başlatmaya veya çıkmaya karar verebilir.

local function mainApp()
  -- simulate work
  for i = 1, 3 do
    print("Tick", i)
    if i == 2 then error("transient error") end
  end
end

local function handler(e)
  return debug.traceback("App error: "..tostring(e), 2)
end

local ok, err = xpcall(mainApp, handler)
if not ok then
  print("Application crashed:\n" .. err)
end

Yapılandırılmış Hata Raporlama

Ayrıntılı ve işlem yapılabilir hata raporları oluşturmak için xpcall'ı yapılandırılmış hata nesneleri ve kapsamlı bir işleyiciyle birleştirin. Bu raporlar hata ayıklama veya izleme panoları için kullanılabilir.

local function handler(err)
  local info = {
    error   = tostring(err),
    time    = os.date("!%Y-%m-%dT%H:%M:%SZ"),
    trace   = debug.traceback(nil, 2),
  }
  return info
end

local ok, report = xpcall(
  function() error({code=500, msg="internal error"}) end,
  handler
)

if not ok then
  print("Time:", report.time)
  print("Error:", report.error)
  -- print("Trace:", report.trace)
end

Eş Yordamlar için xpcall

Bir eş yordamın içinde pcall normal şekilde çalışır. Eş yordamların içindeki hatalardan yığın izlemeleri elde etmek için eş yordam gövdesini xpcall içine sarın. İşleyici, eş yordamın yığın bağlamı içinde çalışır.

local function co_body()
  error("error inside coroutine")
end

local co = coroutine.create(function()
  local ok, err = xpcall(co_body, debug.traceback)
  if not ok then
    print("Caught in coroutine:", err:match("([^\n]+)"))
  end
end)

coroutine.resume(co)

Hata Nesnesini Zenginleştirme

İşleyici, düz bir dize hatasını zengin bir nesneye veya zaten zengin olan bir nesneyi daha da kapsamlı bir nesneye dönüştürebilir. Böylece alt düzey kod basit hatalar fırlatırken işleyici bağlam ekleyebilir (istek kimliği, kullanıcı oturumu veya ortam bilgileri gibi).

local requestID = "req-123"

local function handler(err)
  if type(err) == "string" then
    return {message=err, requestID=requestID, level="error"}
  end
  err.requestID = requestID
  return err
end

local ok, result = xpcall(
  function() error("database timeout") end,
  handler
)

if not ok then
  print(result.message, result.requestID)
  -- database timeout  req-123
end

pcall ve xpcall'ı Karşılaştırma

pcall kullanın: yalnızca hata değerine ihtiyacınız olduğunda, hata beklenen ve satır içinde ele alınan bir durum olduğunda veya basitlik önemli olduğunda. xpcall kullanın: yığın izlemelerine ihtiyaç duyduğunuzda, üst düzey bir sınırda olduğunuzda veya tüm hatalara bağlam eklemek istediğinizde.

-- pcall: simple, no overhead
local ok, err = pcall(function()
  return 1/0   -- no error in Lua! returns inf
end)
print(ok, err)   -- true  inf

-- xpcall: adds traceback
local ok2, err2 = xpcall(
  function() error("real error") end,
  debug.traceback
)
print(ok2)       -- false
print(err2:sub(1,40))  -- first line of traceback

İşleyicinin Dönüş Değeri

İşleyicinin döndürdüğü her şey, xpcall'dan gelen ikinci değer olur. İşleyici nil döndürürse xpcall'ın ikinci dönüş değeri nil olur. Özgün hata nesnesini ek bilgilerle birlikte döndüren bir işleyici en esnek yaklaşımdır.

local function enrichedHandler(err)
  return {
    original = err,
    traceback = debug.traceback(nil, 2),
    timestamp = os.time(),
  }
end

local ok, report = xpcall(
  function() error("oops") end,
  enrichedHandler
)

if not ok then
  print(type(report))          -- table
  print(report.original)       -- ...: oops
  print(report.timestamp > 0)  -- true
end

Kısa Kontrol

xpcall kullanmanın pcall'a göre temel avantajı nedir?

Özet: xpcall

Özet:

  • xpcall(f, handler, ...) — işleyici, yığın bozulmamışken çalışır
  • Tam yığın izlemeleri için işleyici olarak debug.traceback kullanın
  • İşleyici hata vermemelidir — basit tutun
  • İşleyicide hataları bağlam bilgileriyle zenginleştirin
  • Ana döngüleri ve sunucu işleyicilerini xpcall içine sarın
  • İşleyicinin dönüşü, xpcall'ın ikinci dönüş değeri olur

Sıkça Sorulan Sorular

“xpcall ve İleti İşleyicileri” dersi ücretsiz mi?

Evet — “xpcall ve İleti İşleyicileri” 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.

“xpcall ve İleti İşleyicileri” dersinde ne öğreneceğim?

Ayrıntılı hata geri izlemeleri için xpcall'ı özel bir işleyiciyle kullanı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 3. dersidir.

“xpcall ve İleti İşleyicileri” 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