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 zeroLevel 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() callError 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)
endassert() 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 stringerror() 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
endError 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) endPropagasi 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 failedStack 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
endMelempar 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.