Menu
CoddyTech

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

Dalam 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.

challenge icon

Tantangan

Mudah

Tulis 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 b bernilai 0 dan panggil error("Division by zero", 0) jika benar. Jika tidak, kembalikan a / 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 pertama
  • b (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.
end
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Lua online