Error Handling: require, revert, assert
Penjelasan
Solidity punya tiga cara membatalkan eksekusi: `require(kondisi, "pesan")` untuk memvalidasi INPUT/kondisi eksternal (paling sering dipakai, mis. mengecek saldo cukup), `revert("pesan")` untuk membatalkan dengan kondisi lebih kompleks (bisa dipakai di dalam if tanpa kondisi boolean tunggal), dan `assert(kondisi)` untuk mengecek INVARIANT internal yang SEHARUSNYA tidak pernah salah (kalau assert gagal, itu tanda ada BUG di kode, bukan kesalahan pengguna). Ketiganya membatalkan SEMUA perubahan state dalam transaksi itu (rollback penuh) kalau gagal.
Contoh Konsep
contract Dompet {
mapping(address => uint256) public saldo;
function tarik(uint256 jumlah) public {
require(saldo[msg.sender] >= jumlah, "Saldo tidak cukup"); // validasi input
saldo[msg.sender] -= jumlah;
if (jumlah == 0) {
revert("Jumlah tidak boleh nol"); // kondisi lebih kompleks
}
assert(saldo[msg.sender] >= 0); // invariant: saldo tidak boleh negatif (uint sudah menjamin ini)
}
}
Praktikum
Buat function beli(uint256 hargaBarang) yang menerima parameter uint256 uangDibayar, dan require uangDibayar harus lebih besar sama dengan hargaBarang dengan pesan "Uang tidak cukup".
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
Pakai `require` untuk HAMPIR SEMUA validasi biasa (input pengguna, saldo, izin akses) — simpan `assert` HANYA untuk kondisi yang secara logika TIDAK MUNGKIN gagal kecuali ada bug, karena `assert` yang gagal punya konotasi "kode ini rusak", bukan "pengguna salah input".