0Pricing
Lua Academy · Pelajaran

Fungsi error()

Bangkitkan galat dengan error() dan pahami tingkat serta pesan galat.

Fungsi error() adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Membangkitkan Error

error(message, level) membangkitkan error Lua. Eksekusi berhenti dan error merambat ke atas tumpukan pemanggilan hingga ditangkap oleh pcall atau xpcall, atau hingga mengakhiri program. Pesannya dapat berupa nilai apa pun—string, tabel, atau angka.

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

Level Error

Argumen kedua untuk error() mengatur lokasi pelaporan error. Level 1 (bawaan) menunjuk ke pemanggilan error() itu sendiri. Level 2 menunjuk ke pemanggilnya. Level 0 tidak menambahkan informasi lokasi. Gunakan level 2 dalam fungsi pustaka agar kode pengguna ditunjuk sebagai sumber masalah.

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

Error dengan Objek Tabel

Dengan meneruskan tabel sebagai nilai error, pemanggil dapat memeriksa informasi error terstruktur: kode error, pesan, dan konteks. Cara ini lebih informatif daripada string biasa dan memungkinkan penanganan error secara terprogram.

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

assert() sebagai Sintaks Praktis

assert(v, msg) setara dengan if not v then error(msg, 2) end; return v, .... Cara ini lazim digunakan untuk memeriksa prasyarat. Jika v bernilai benar, assert mengembalikan semua argumennya (berguna untuk perangkaian).

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() vs return nil,err

Ada dua konvensi untuk menandai kegagalan: error() (gaya pengecualian) atau return nil, msg (gaya fungsional). Gunakan error() untuk kondisi yang benar-benar tidak terduga (bug pemrograman, pelanggaran kontrak). Gunakan nil, msg untuk kegagalan yang diperkirakan (file tidak ditemukan, waktu tunggu jaringan habis).

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

Error dalam Metamethod

Error dapat dibangkitkan di dalam metamethod. Jika metamethod menghasilkan error, error tersebut merambat ke kode yang memicu operasi (seperti ekspresi aritmetika). Selalu cegah input yang tidak valid dalam metamethod.

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)

Jenis Error Kustom

Buat helper untuk membangun objek error bertipe. Sertakan penanda jenis agar pemanggil dapat membedakan berbagai jenis error dan menanganinya dengan tepat.

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

Propagasi Error

Ketika suatu fungsi memanggil fungsi lain yang menghasilkan error, error tersebut otomatis merambat naik melalui stack. Anda tidak perlu melakukan pelemparan ulang—cukup jangan menangkapnya. Tangkap error hanya pada tingkat yang memungkinkan Anda menanganinya atau melaporkannya secara bermakna.

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

Stack Trace dengan debug.traceback

error() biasa memberikan satu baris konteks. Untuk stack trace lengkap, gunakan debug.traceback(msg) sebagai nilai error. Ini biasanya dilakukan dalam handler xpcall.

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

Melempar Ulang Error

Terkadang Anda menangkap error untuk menambahkan konteks, lalu melemparkannya kembali. Gunakan error(err, 0) (tingkat 0) saat melempar ulang error berupa string agar tidak menambahkan awalan lokasi lain pada pesan yang sudah diformat.

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)

Pemeriksaan Singkat

Apa arti tingkat 2 dalam error("msg", 2)?

Rangkuman: error()

Rangkuman:

  • error(msg, level) — melempar error; tingkat 2 menyalahkan pemanggil
  • Gunakan tabel untuk error terstruktur dengan jenis dan konteks
  • assert(v, msg) — pemeriksaan prasyarat idiomatis
  • Gunakan error() untuk bug; kembalikan nil+err untuk kegagalan yang diperkirakan
  • Lempar ulang dengan error(err, 0) untuk mempertahankan format pesan

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Fungsi error()” gratis?

Ya — teks lengkap “Fungsi error()” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Fungsi error()”?

Bangkitkan galat dengan error() dan pahami tingkat serta pesan galat. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.

Berapa lama pelajaran “Fungsi error()” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Fungsi error()
  2. Pemanggilan Terlindungi dengan pcall
  3. xpcall dan Penangan Pesan
  4. Objek Galat Terstruktur
← Kembali ke Lua Academy