0Pricing
Lua Academy · Pelajaran

Menutup Berkas dan Menangani Galat

Tutup handle berkas dengan benar dan tangani galat io dengan pcall.

Menutup Berkas dan Menangani Galat adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Selalu Tutup File

Setiap file yang dibuka dengan io.open harus ditutup dengan f:close(). File yang tidak ditutup menyebabkan kebocoran deskriptor file. Pengumpul sampah Lua pada akhirnya akan menutupnya, tetapi batas file OS dapat habis sebelum pengumpul sampah berjalan. Selalu tutup file dalam fungsi yang membukanya.

local function readFile(path)
  local f, err = io.open(path, "r")
  if not f then return nil, err end
  local content = f:read("a")
  f:close()   -- always close
  return content
end

local data, err = readFile("config.txt")
if not data then print("Error:", err) end

pcall untuk Keamanan IO

Bungkus operasi file dengan pcall untuk menangkap error yang tidak terduga (disk penuh, izin ditolak di tengah penulisan). Dengan demikian, Anda dapat menangani error dengan baik alih-alih membuat program berhenti.

local function safeCopy(src, dst)
  local ok, err = pcall(function()
    local f = io.open(src, "rb")
    if not f then error("Cannot open source: " .. src) end
    local content = f:read("a")
    f:close()
    local g = io.open(dst, "wb")
    if not g then error("Cannot open dest: " .. dst) end
    g:write(content)
    g:close()
  end)
  return ok, err
end

local ok, msg = safeCopy("input.txt", "output.txt")
if not ok then print("Failed:", msg) end

Memeriksa Keberhasilan Penulisan

Pada sistem dengan disk penuh atau masalah izin, f:write() dapat gagal meskipun io.open berhasil. Periksa nilai kembalian operasi penulisan pada bagian kode yang penting.

local f = io.open("important.txt", "w")
if not f then
  print("Cannot create file")
  return
end

local ok, err = f:write("critical data\n")
if not ok then
  print("Write failed:", err)
  f:close()
  return
end

f:close()
print("Saved successfully")

Pola finally dengan pcall

Lua tidak memiliki blok finally, tetapi Anda dapat menyimulasikannya dengan pcall. Bungkus kode yang berisiko dalam pcall; setelah pcall mengembalikan hasil (berhasil atau gagal), jalankan kode pembersihan tanpa syarat sebelum meneruskan kembali atau menangani error.

local function withFile(path, mode, fn)
  local f, err = io.open(path, mode)
  if not f then return nil, err end
  local ok, result = pcall(fn, f)
  f:close()   -- always close, even on error
  if not ok then
    return nil, result
  end
  return result
end

local content, err = withFile("data.txt", "r", function(f)
  return f:read("a")
end)
print(content or err)

Pesan Error dari io.open

io.open mengembalikan nil beserta pesan error sistem dan kode error. Pesan tersebut mencakup path serta alasan error dari OS ("No such file", "Permission denied", dan sebagainya). Selalu sertakan pesan error dalam laporan error kepada pengguna.

local paths = {"config.txt", "missing.txt", "/root/secret.txt"}

for _, path in ipairs(paths) do
  local f, err, code = io.open(path, "r")
  if f then
    print(path, "-> ok, size:", f:seek("end"))
    f:close()
  else
    print(path, "-> ERROR:", err, "(code "..tostring(code)..")")
  end
end

Handle File sebagai Objek

Handle file Lua adalah userdata dengan metode. Saat handle dikumpulkan oleh pengumpul sampah, file otomatis ditutup. Namun, jangan mengandalkan pengumpul sampah untuk penutupan tepat waktu—selalu tutup secara eksplisit. Anda dapat memeriksa apakah file sudah ditutup dengan f:read()—operasi tersebut akan menghasilkan error pada handle yang sudah ditutup.

local f = io.open("test.txt", "w")
f:write("test\n")

-- Explicit close
f:close()

-- After close, operations fail
local ok, err = pcall(function()
  f:read()   -- attempt to use closed file
end)
print(ok, err)   -- false  [closed file]

Templat Pemrosesan File yang Aman

Templat yang dapat digunakan kembali untuk pemrosesan file yang aman: buka dengan pemeriksaan error, proses dengan pcall, dan tutup dalam semua keadaan. Kembalikan hasil dan error secara konsisten menggunakan konvensi nil+message.

local function processFile(path, processor)
  local f, err = io.open(path, "r")
  if not f then return nil, "open failed: " .. err end
  
  local ok, result = pcall(processor, f)
  f:close()
  
  if not ok then
    return nil, "processing failed: " .. result
  end
  return result
end

local lineCount, err = processFile("data.txt", function(f)
  local n = 0
  for _ in f:lines() do n = n + 1 end
  return n
end)
print(lineCount or err)

os.remove dan os.rename

os.remove(path) menghapus file. os.rename(old, new) mengganti nama atau memindahkan file. Keduanya mengembalikan true jika berhasil atau nil, errMessage jika gagal. Keduanya merupakan fungsi utama untuk manipulasi sistem file dalam Lua standar.

-- Delete a file
local ok, err = os.remove("temp.txt")
if not ok then print("Remove failed:", err) end

-- Rename / move
ok, err = os.rename("old_name.txt", "new_name.txt")
if not ok then print("Rename failed:", err) end

-- Atomic update pattern
os.rename("config.new", "config.txt")

io.close vs f:close

io.close(f) setara dengan f:close(). io.close() tanpa argumen menutup file output bawaan. Dalam sebagian besar kode, gunakan f:close() agar lebih jelas.

local f = io.open("test.txt", "w")
f:write("hello\n")

-- Both are equivalent:
-- f:close()
io.close(f)

-- io.close() with no arg closes default output
io.output("out.txt")
io.write("to file\n")
io.close()   -- closes out.txt, restores stdout

Menyalin File dengan Andal

Penyalinan file berkualitas produksi dengan penanganan error pada setiap langkah: buka sumber, buka tujuan, salin dalam potongan, tangani error penulisan, lalu tutup kedua file.

local function copyFile(src, dst, chunkSize)
  chunkSize = chunkSize or 65536
  local fsrc, err1 = io.open(src, "rb")
  if not fsrc then return nil, err1 end
  local fdst, err2 = io.open(dst, "wb")
  if not fdst then fsrc:close(); return nil, err2 end
  
  local ok = true
  local chunk = fsrc:read(chunkSize)
  while chunk and ok do
    local w, werr = fdst:write(chunk)
    if not w then ok = false; err2 = werr end
    chunk = fsrc:read(chunkSize)
  end
  fsrc:close(); fdst:close()
  if not ok then os.remove(dst); return nil, err2 end
  return true
end

Pemeriksaan Singkat

Apa cara terbaik untuk memastikan file selalu ditutup di Lua, bahkan jika terjadi error?

Ringkasan: Penutupan dan Penanganan Error

Ringkasan:

  • Selalu panggil f:close() secara eksplisit—jangan mengandalkan pengumpul sampah
  • Bungkus IO dalam pcall untuk penanganan error yang andal
  • Gunakan templat "buka → pcall → tutup"
  • os.remove / os.rename untuk operasi sistem file
  • Periksa nilai kembalian penulisan dalam kode penting

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menutup Berkas dan Menangani Galat” gratis?

Ya — teks lengkap “Menutup Berkas dan Menangani Galat” 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 “Menutup Berkas dan Menangani Galat”?

Tutup handle berkas dengan benar dan tangani galat io dengan pcall. 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 4 dari 4.

Berapa lama pelajaran “Menutup Berkas dan Menangani Galat” 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. Membuka Berkas dengan io.open
  2. Membaca Isi Berkas
  3. Menulis dan Menambahkan Isi ke Berkas
  4. Menutup Berkas dan Menangani Galat
← Kembali ke Lua Academy