0Pricing
Lua Academy · Pelajaran

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

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

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

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

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

pcall 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)
end

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

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

Konvensi 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)
end

Pemeriksaan Singkat

Apa yang dikembalikan pcall ketika fungsi yang dilindungi berhasil?

Rangkuman: pcall

Rangkuman:

  • pcall(f, ...) → true, results... atau false, 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

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