error() İşlevi
error() ile hata üretin ve hata düzeyleriyle iletilerini anlayın.
error() İşlevi, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 1. 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.
Hata Oluşturma
error(message, level) bir Lua hatası oluşturur. Yürütme durur ve hata, pcall veya xpcall tarafından yakalanana ya da program sonlanana kadar çağrı yığını boyunca üst katmanlara aktarılır. İleti herhangi bir değer olabilir: dize, tablo veya sayı.
local function divide(a, b)
if b == 0 then
error("division by zero")
end
return a / b
end
print(divide(10, 2)) -- 5.0
-- divide(10, 0) -- ERROR: division by zeroHata Düzeyleri
error() işlevinin ikinci bağımsız değişkeni, hatanın nerede bildirileceğini denetler. Düzey 1 (varsayılan), error() çağrısının kendisini gösterir. Düzey 2, çağıranı gösterir. Düzey 0 konum bilgisi eklemez. Kütüphane işlevlerinde hatayı kullanıcının koduna yöneltmek için düzey 2'yi kullanın.
local function assertPositive(n, name)
if n <= 0 then
error((name or "value") .. " must be positive, got " .. n, 2)
-- level 2: blame the caller, not this function
end
return n
end
local function compute(x)
assertPositive(x, "x") -- error points here if x <= 0
return math.sqrt(x)
end
compute(-5) -- error: "x must be positive, got -5" at compute() callTablo Nesneleriyle Hata
Hata değeri olarak bir tablo geçirmek, çağıranların yapılandırılmış hata bilgilerini (hata kodu, ileti, bağlam) incelemesini sağlar. Bu, düz bir dizeden daha bilgilendiricidir ve programatik hata işlemeye olanak tanır.
local function openDB(host, port)
if port < 1 or port > 65535 then
error({code="INVALID_PORT", port=port,
msg="port out of range: " .. port})
end
-- ... connect
return {host=host, port=port}
end
local ok, err = pcall(openDB, "localhost", -1)
if not ok and type(err) == "table" then
print("Code:", err.code) -- INVALID_PORT
print("Port:", err.port) -- -1
print("Msg:", err.msg)
endŞeker Olarak assert()
assert(v, msg), if not v then error(msg, 2) end; return v, ... ile eşdeğerdir. Ön koşul denetimi için deyimsel bir kullanımdır. v doğru kabul edilen bir değerse assert tüm bağımsız değişkenlerini döndürür (zincirleme için kullanışlıdır).
local function sqrt(n)
assert(type(n) == "number", "expected number, got " .. type(n))
assert(n >= 0, "sqrt of negative: " .. n)
return math.sqrt(n)
end
print(sqrt(16)) -- 4.0
print(sqrt(2)) -- 1.4142...
-- sqrt("hi") -- ERROR: expected number, got stringerror() ile return nil,err Karşılaştırması
Başarısızlığı bildirmek için iki kural vardır: error() (istisna tarzı) veya return nil, msg (işlevsel tarz). error() işlevini gerçekten beklenmeyen durumlarda (programlama hataları, sözleşme ihlalleri) kullanın. Beklenen başarısızlıklar (dosyanın bulunamaması, ağ zaman aşımı) için nil, msg kullanın.
-- Exception style (programming error)
local function mustExist(t, key)
local v = t[key]
if v == nil then error("required key missing: " .. key, 2) end
return v
end
-- Functional style (expected failure)
local function findUser(id)
-- ... database query
return nil, "user not found" -- expected: user may not exist
endMetayöntemlerde Hata
Metayöntemlerin içinde hatalar oluşturulabilir. Bir metayöntemde hata oluşursa, işlem (örneğin bir aritmetik ifade) tarafından tetiklenen koda aktarılır. Metayöntemlerde geçersiz girdilere karşı her zaman önlem alın.
local SafeDiv = {}
SafeDiv.__index = SafeDiv
SafeDiv.__div = function(a, b)
if b.value == 0 then
error("SafeDiv: division by zero", 2)
end
return SafeDiv.new(a.value / b.value)
end
function SafeDiv.new(v)
return setmetatable({value=v}, SafeDiv)
end
local a = SafeDiv.new(10)
local b = SafeDiv.new(0)
local ok, err = pcall(function() return a / b end)
print(ok, err)Özel Hata Türleri
Tür bilgisi taşıyan hata nesneleri oluşturmak için bir yardımcı oluşturun. Çağıranların farklı hata türlerini ayırt edebilmesi ve her birini uygun şekilde işleyebilmesi için bir tür etiketi ekleyin.
local function newError(kind, msg, extra)
return setmetatable(
{kind=kind, message=msg, extra=extra},
{__tostring = function(e)
return "[" .. e.kind .. "] " .. e.message
end}
)
end
local E = {
notFound = function(name) return newError("NOT_FOUND","not found: "..name) end,
badInput = function(msg) return newError("BAD_INPUT", msg) end,
}
local ok, err = pcall(error, E.notFound("config.json"))
if not ok then print(err.kind, err.message) endHataların Yayılması
Bir işlev hata veren başka bir işlevi çağırdığında hata yığın boyunca otomatik olarak yayılır. Yeniden fırlatmanız gerekmez; yalnızca hatayı yakalamayın. Hataları sadece anlamlı bir şekilde işleyebileceğiniz veya raporlayabileceğiniz düzeyde yakalayın.
local function step3() error("step3 failed") end
local function step2() step3() end
local function step1() step2() end
local ok, err = pcall(step1)
if not ok then
-- err includes the source location
print("Caught at top level:", err)
end
-- Error: input:1: step3 faileddebug.traceback ile Yığın İzlemesi
Düz bir error() tek satırlık bağlam bilgisi sağlar. Tam bir yığın izlemesi için hata değeri olarak debug.traceback(msg) kullanın. Bu işlem genellikle bir xpcall işleyicisinde yapılır.
local function buggy()
local t = nil
return t.field -- nil indexing: error
end
local ok, err = xpcall(buggy, function(e)
return debug.traceback(e, 2) -- full stack trace
end)
if not ok then
print(err) -- full traceback
endHataları Yeniden Fırlatma
Bazen bağlam eklemek için bir hatayı yakalayıp ardından yeniden fırlatırsınız. Önceden biçimlendirilmiş bir mesaja başka bir konum ön eki eklenmesini önlemek amacıyla, dize türündeki bir hatayı yeniden fırlatırken error(err, 0) (0 düzeyi) kullanın.
local function loadAndParse(path)
local ok, err = pcall(function()
local f = io.open(path, "r")
if not f then error("cannot open: " .. path) end
local content = f:read("a")
f:close()
return content
end)
if not ok then
error("loadAndParse failed: " .. err, 0) -- re-raise with context
end
end
local ok2, msg = pcall(loadAndParse, "missing.txt")
print(ok2, msg)Kısa Kontrol
error("msg", 2) içindeki 2. düzey ne anlama gelir?
Özet: error()
Özet:
error(msg, level)— hata fırlatır; 2. düzey sorumluluğu çağırana yükler- Tür ve bağlam içeren yapılandırılmış hatalar için tabloları kullanın
assert(v, msg)— deyimsel ön koşul denetimi- Hatalar için
error()kullanın; beklenen başarısızlıklar için nil+err döndürün - Mesaj biçimini korumak için
error(err, 0)ile yeniden fırlatın
Sıkça Sorulan Sorular
“error() İşlevi” dersi ücretsiz mi?
Evet — “error() İşlevi” 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.
“error() İşlevi” dersinde ne öğreneceğim?
error() ile hata üretin ve hata düzeyleriyle iletilerini anlayı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 1. dersidir.
“error() İşlevi” 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.