Panggilan terlindungi dengan pcall()
Termasuk bagian Logika dan Alur dalam perjalanan Lua di Coddy. Pelajaran 33 dari 54.
Walaupun error() menghentikan programmu saat terjadi kesalahan, terkadang kamu ingin menangani kesalahan tanpa membuat programmu berhenti. Fungsi pcall() milik Lua memungkinkan kamu menjalankan kode dengan aman meskipun kode itu mungkin gagal.
Nama pcall() merupakan singkatan dari "protected call". Fungsi ini membungkus pemanggilan fungsi dengan lapisan pelindung yang menangkap error apa pun. Alih-alih membuat programmu mogok, pcall() mengembalikan informasi tentang apa yang terjadi.
Berikut sintaks dasarnya:
local status, result = pcall(functionName, arg1, arg2)Fungsi pcall() mengembalikan dua nilai. Nilai pertama adalah status boolean: true jika fungsi berhasil, atau false jika terjadi error. Nilai kedua bergantung pada statusnya, jika berhasil, nilai ini adalah nilai yang dikembalikan fungsi; jika terjadi error, nilai ini adalah pesan error.
Berikut contoh praktis:
function divide(a, b)
if b == 0 then
error("Cannot divide by zero")
end
return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
print("Result: " .. result)
else
print("Error caught: " .. result)
endDalam contoh ini, pembagian dengan nol memicu error, tetapi alih-alih membuat program berhenti, pcall() menangkapnya. Program terus berjalan dan dapat menangani error dengan baik dengan memeriksa nilai status.
Ingat, pcall() menangkap setiap error di dalam pemanggilan, termasuk bug yang tidak kamu duga, dan melaporkan semuanya dengan cara yang sama. Jadi, bungkus hanya pemanggilan yang bisa gagal. Untuk kegagalan yang kamu perkirakan, lebih baik gunakan fungsi yang mengembalikan nil dan pesan, seperti pada pelajaran sebelumnya.
Tantangan
MudahTulis fungsi safeCalculate yang menerima operation, a, dan b, lalu mengembalikan hasil perhitungan atau pesan error.
Fungsi ini harus menggunakan pcall() untuk melakukan operasi matematika yang diminta dengan aman. Buat fungsi bagian dalam yang melakukan perhitungan berdasarkan string operasi, lalu bungkus dengan pcall() untuk menangkap error.
Logika:
- Buat fungsi bagian dalam yang memeriksa jenis operasi dan melakukan perhitungan
- Untuk "add", kembalikan
a + b - Untuk "subtract", kembalikan
a - b - Untuk "multiply", kembalikan
a * b - Untuk "divide", periksa apakah
bbernilai 0 dan panggilerror("Division by zero", 0)jika benar. Jika tidak, kembalikana / b - Untuk operasi lainnya, panggil
error("Invalid operation", 0) - Gunakan
pcall()untuk menjalankan fungsi bagian dalam - Jika berhasil, kembalikan
"Result: "diikuti hasilnya - Jika terjadi error, kembalikan
"Error: "diikuti pesan error
Berikan 0 sebagai argumen kedua untuk error(). Argumen itu adalah tingkat error, dan 0 memberi tahu Lua agar tidak menambahkan nama file dan nomor baris di depan pesanmu, sehingga string yang dikembalikan persis "Error: Division by zero".
Parameter:
operation(string): Operasi yang akan dilakukan ("add", "subtract", "multiply", atau "divide")a(number): Operand pertamab(number): Operand kedua
Nilai yang dikembalikan: String yang berisi "Result: " diikuti hasil perhitungan, atau "Error: " diikuti pesan error (string)
Coba sendiri
function safeCalculate(operation, a, b)
-- Tulis kodemu di sini
-- Catatan: panggil error(message, 0) agar Lua tidak menambahkan nama file dan
-- nomor baris di depan pesanmu.
endPelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Iterasi Tabel Tingkat Lanjut
Iterasi dengan pairs()Iterasi dengan ipairs()pairs() vs. ipairs()Rangkuman: Lembar Karakter2Fungsi library tabel Lainnya
table.concat()Pembuatan tabel & unpack()table.sort()Pengurutan Kustom dengan FungsiRangkuman, Papan Skor TertinggiLatihan sendiri: Compiler Lua online