0Pricing
Lua Academy · Ders

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 zero

Hata 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() call

Tablo 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 string

error() 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
end

Metayö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) end

Hataları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 failed

debug.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
end

Hataları 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.

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