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) endpcall 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) endMemeriksa 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
endHandle 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 stdoutMenyalin 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
endPemeriksaan 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.renameuntuk 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
- Membuka Berkas dengan io.open
- Membaca Isi Berkas
- Menulis dan Menambahkan Isi ke Berkas
- Menutup Berkas dan Menangani Galat