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)
endBağ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)
endYapı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)
endEş 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
endpcall 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
endKı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.tracebackkullanı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
- error() İşlevi
- pcall ile Korumalı Çağrılar
- xpcall ve İleti İşleyicileri
- Yapılandırılmış Hata Nesneleri