Pemanggilan Terlindungi dengan pcall
Tangkap galat dengan aman menggunakan pcall dan tafsirkan nilai kembalian.
Pemanggilan Terlindungi dengan pcall adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Dasar-Dasar pcall
pcall(f, ...) memanggil fungsi f dengan argumen ... dalam mode terlindungi. Jika f berhasil, pcall mengembalikan true diikuti semua nilai yang dikembalikan. Jika f menghasilkan error, pcall mengembalikan false diikuti pesan error. Program tetap berlanjut dalam kedua kondisi tersebut.
local function risky(x)
if x < 0 then error("negative input: " .. x) end
return math.sqrt(x)
end
local ok, result = pcall(risky, 9)
print(ok, result) -- true 3.0
ok, result = pcall(risky, -1)
print(ok, result) -- false ...: negative input: -1Menangkap Error Tertentu
Periksa jenis nilai error setelah pcall untuk menangani berbagai jenis error secara berbeda. Error berupa tabel memiliki data terstruktur, sedangkan error berupa string memiliki pesan. Selalu tangani kedua kasus tersebut.
local function op(errType)
if errType == "table" then
error({code=42, msg="structured error"})
else
error("plain string error")
end
end
local ok, err = pcall(op, "table")
if not ok then
if type(err) == "table" then
print("Code:", err.code, "Msg:", err.msg)
else
print("String error:", err)
end
endBeberapa Nilai Kembalian saat Berhasil
Saat berhasil, pcall mengembalikan semua nilai kembalian fungsi yang dilindungi setelah true awal. Tampung nilai-nilai tersebut dalam beberapa variabel.
local function compute(a, b)
return a + b, a * b, a - b
end
local ok, sum, product, diff = pcall(compute, 6, 4)
if ok then
print("sum:", sum, "product:", product, "diff:", diff)
-- sum: 10 product: 24 diff: 2
endMenyusun pcall secara Bersarang
Panggilan pcall dapat disusun secara bersarang. Setiap pcall membuat lingkup terlindungi yang independen. Error dalam pcall bagian dalam ditangkap oleh pcall bagian dalam, bukan yang luar. Dengan demikian, Anda dapat menerapkan strategi cadangan.
local function tryPrimary()
error("primary failed")
end
local function tryFallback()
return "fallback result"
end
local ok, result = pcall(tryPrimary)
if not ok then
print("Primary failed:", result)
ok, result = pcall(tryFallback)
end
if ok then print("Got:", result) end -- fallback resultpcall dengan Method
Untuk memanggil method (sintaks titik dua) melalui pcall, teruskan fungsi dan objek sebagai argumen pertama. pcall(obj.method, obj, args...) atau bungkus dalam closure.
local obj = {
x = 10,
compute = function(self, n)
if n == 0 then error("zero divisor") end
return self.x / n
end
}
-- Pass method + self explicitly
local ok, v = pcall(obj.compute, obj, 2)
print(ok, v) -- true 5.0
-- Or use a closure
ok, v = pcall(function() return obj:compute(0) end)
print(ok, v) -- false ...zero divisorpcall untuk Keamanan IO
Bungkus operasi IO dalam pcall untuk menangkap error OS yang tidak terduga. Kembalikan pasangan hasil/error yang konsisten agar pemanggil dapat menangani kegagalan dengan baik.
local function safeRead(path)
local ok, result = pcall(function()
local f = assert(io.open(path, "r"))
local content = f:read("a")
f:close()
return content
end)
if ok then return result
else return nil, result
end
end
local data, err = safeRead("config.txt")
if data then print("Read", #data, "bytes")
else print("Error:", err)
endPola Percobaan Ulang dengan pcall
Coba ulang operasi yang tidak stabil (permintaan jaringan, penulisan file) hingga N kali, menggunakan pcall untuk menangkap error. Beri jeda di antara percobaan ulang dalam kode nyata (atau gunakan coroutine).
local function retry(fn, maxAttempts)
local attempts = 0
while attempts < maxAttempts do
attempts = attempts + 1
local ok, result = pcall(fn)
if ok then
print("Succeeded on attempt", attempts)
return result
end
print("Attempt", attempts, "failed:", result)
end
error("all " .. maxAttempts .. " attempts failed")
end
local n = 0
retry(function()
n = n + 1
if n < 3 then error("not ready") end
return "done"
end, 5)Menyimpan Hasil pcall dalam Tabel
Saat pcall digunakan dalam perulangan, simpan hasilnya dalam tabel untuk dianalisis nanti. Ini berguna untuk operasi batch ketika Anda ingin memproses semua item dan mengumpulkan error, bukan berhenti pada kegagalan pertama.
local jobs = {10, -5, 25, 0, 16}
local results = {}
for _, n in ipairs(jobs) do
local ok, v = pcall(function()
if n < 0 then error("negative") end
return math.sqrt(n)
end)
results[#results+1] = {input=n, ok=ok, value=v}
end
for _, r in ipairs(results) do
if r.ok then
print(r.input, "->", string.format("%.3f", r.value))
else
print(r.input, "-> ERROR:", r.value)
end
endpcall vs xpcall
pcall menangkap error, tetapi hanya memberikan nilai error. xpcall memungkinkan Anda memberikan fungsi handler pesan yang berjalan saat stack masih utuh, sehingga dapat menghasilkan stack trace. Pilih xpcall saat Anda memerlukan traceback.
-- pcall: simple, no traceback
local ok1, err1 = pcall(function()
error("simple error")
end)
print(err1) -- only the error message
-- xpcall: with traceback handler
local ok2, err2 = xpcall(
function() error("traced error") end,
function(e) return debug.traceback(e, 2) end
)
print(err2) -- full stack traceKonvensi Nilai Kembalian pcall
Gunakan pcall sebagai dasar API yang konsisten: selalu kembalikan value saat berhasil atau nil, errorMessage saat gagal. Susun fungsi Anda dengan cara ini agar pemanggil selalu mengetahui hal yang dapat diharapkan.
local function loadJSON(path)
local ok, result = pcall(function()
local f = assert(io.open(path, "r"))
local text = f:read("a")
f:close()
-- Fake JSON parse for demo
return {data = text, path = path}
end)
if ok then return result
else return nil, result
end
end
local data, err = loadJSON("data.json")
if data then print("Loaded:", data.path)
else print("Failed:", err)
endPemeriksaan Singkat
Apa yang dikembalikan pcall ketika fungsi yang dilindungi berhasil?
Rangkuman: pcall
Rangkuman:
pcall(f, ...)→true, results...ataufalse, err- Periksa nilai kembalian pertama untuk menentukan keberhasilan atau kegagalan
- Beberapa nilai kembalian muncul setelah true saat berhasil
- pcall bersarang: masing-masing menangkap errornya sendiri secara independen
- Pola percobaan ulang: lakukan perulangan dengan pcall untuk operasi yang tidak stabil
- Gunakan xpcall saat memerlukan stack trace
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pemanggilan Terlindungi dengan pcall” gratis?
Ya — teks lengkap “Pemanggilan Terlindungi dengan pcall” 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 “Pemanggilan Terlindungi dengan pcall”?
Tangkap galat dengan aman menggunakan pcall dan tafsirkan nilai kembalian. 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 2 dari 4.
Berapa lama pelajaran “Pemanggilan Terlindungi dengan pcall” 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
- Fungsi error()
- Pemanggilan Terlindungi dengan pcall
- xpcall dan Penangan Pesan
- Objek Galat Terstruktur