Sejauh ini setiap galat yang kita timbulkan — indexing di luar batas, operand yang salah tipe — menghentikan program begitu galat terjadi. Program dunia nyata tidak boleh serapuh itu: berkas yang gagal dibaca, data yang tidak sesuai format, atau pembagian dengan nol seharusnya ditangani dengan pesan yang jelas, bukan crash yang membingungkan pengguna. MATLAB menyediakan tiga lapis pertahanan untuk itu: error() melempar galat dengan sengaja, try/catch menangkap galat saat runtime, dan warning() memberi sinyal tanpa menghentikan program. Chapter ini membahas ketiganya dari sudut praktis.
error(): Melempar Galat Sendiri #
Fungsi error() menghentikan eksekusi di titik pemanggilannya dan menampilkan pesan yang kita susun sendiri. Dua bentuknya yang penting: error('pesan') untuk pesan sederhana, dan error('komponen:nomor', 'pesan') yang menyertakan identifier — label bertingkat seperti demo:bagiNol yang memudahkan penyaringan galat berdasarkan sumbernya. Pesan mendukung format specifier seperti sprintf, sehingga nilai variabel dapat disisipkan langsung.
Mekanisme di balik layar: error() membungkus pesan dan identifier ke dalam objek MException — kelas galat standar MATLAB yang memuat properti message, identifier, dan stack (jejak lokasi galat). Objek inilah yang nanti kita tangkap di blok catch.
Satu fakta penting sebelum lanjut: di MATLAB, pembagian skalar dengan nol tidak menghasilkan galat — hasilnya Inf. Konsekuensinya, pengecekan penyebut nol harus memakai error() secara eksplisit:
% Potongan galat — penyebut nol harus ditolak manual
pembilang = 100;
penyebut = 0;
if penyebut == 0
error('demo:bagiNol', 'Penyebut tidak boleh nol');
end
hasil = pembilang / penyebut; % tidak pernah tercapaiSaat baris error() tereksekusi, MATLAB menghentikan script pada saat itu juga — baris pembagian di bawahnya tidak pernah dijalankan.
try/catch: Menangkap Galat #
Struktur try ... catch err ... end (ditutup end seperti semua blok MATLAB) menjalankan blok try; bila galat apa pun terjadi di dalamnya, eksekusi melompat ke blok catch alih-alih menghentikan program. Variabel err setelah catch menerima objek MException berisi detail galat. Kita gabungkan dengan contoh pembagian sebelumnya:
pembilang = 100;
penyebut = 0;
try
if penyebut == 0
error('demo:bagiNol', 'Penyebut tidak boleh nol');
end
hasilBagi = pembilang / penyebut;
fprintf('hasil = %g\n', hasilBagi);
catch err
fprintf('Galat ditangkap : %s\n', err.message);
fprintf('Identifier : %s\n', err.identifier);
endOutput yang Dihasilkan:
Galat ditangkap : Penyebut tidak boleh nol
Identifier : demo:bagiNolMari kita bedah baris-baris kode di atas:
- Baris 3 (
try): membuka wilayah terlindungi — galat apa pun di dalam blok ini tidak lagi menghentikan program. - Baris 4-5 (
if ... error(...)): validasi penyebut; karenapenyebutbernilai 0, fungsierror()melemparMExceptiondengan identifierdemo:bagiNol. - Baris 7-8 (
hasilBagi ... fprintf): terlewati seluruhnya — lemparan galat memindahkan eksekusi langsung kecatch. - Baris 9 (
catch err): menangkap objek galat ke variabelerr; baris-baris setelah blokcatchtetap dijalankan normal. - Baris 10-11 (
err.message,err.identifier): kedua properti objekMExceptiondicetak — pesan untuk manusia, identifier untuk penyaringan otomatis.
rethrow: Melempar Ulang #
Kadang lapisan dalam menangkap galat hanya untuk mencatat log, lalu menyerahkan keputusan ke lapisan luar. Fungsi rethrow(err) melempar ulang objek galat yang sama persis — pesan, identifier, dan jejak stack aslinya tetap utuh:
try
try
error('demo:dataHilang', 'Data mentah tidak ditemukan');
catch err
fprintf('lapisan dalam melempar ulang galat\n');
rethrow(err);
end
catch errLuar
fprintf('lapisan luar menangkap: %s (%s)\n', ...
errLuar.message, errLuar.identifier);
endOutput yang Dihasilkan:
lapisan dalam melempar ulang galat
lapisan luar menangkap: Data mentah tidak ditemukan (demo:dataHilang)Mari kita bedah baris-baris kode di atas:
- Baris 2-3 (
try ... error): galatdemo:dataHilangdilempar di lapisan terdalam. - Baris 4-6 (
catch err ... rethrow(err)): lapisan dalam mencatat kejadian lewatfprintf, lalu melempar ulang objek yang sama — bilarethrowdigantierrorbaru, identifier bisa tidak sengaja berubah. - Baris 8-10 (
catch errLuar): lapisan luar menerima galat yang masih membawa detail aslinya dan mencetak pesan + identifier.
warning(): Sinyal Tanpa Berhenti #
warning() mencetak peringatan berwarna oranye tanpa menghentikan eksekusi — cocok untuk keadaan yang patut dicurigai namun masih bisa dilanjutkan. Sintaksnya menyerupai error(), termasuk dukungan identifier dan pesan berformat:
sisaStok = 3;
if sisaStok < 5
warning('demo:stokRendah', 'Stok menipis: %d unit tersisa', sisaStok);
end
fprintf('program tetap berlanjut sampai selesai\n');Output yang Dihasilkan (tampilan MATLAB):
Warning: Stok menipis: 3 unit tersisa
program tetap berlanjut sampai selesaiPeringatan tampil lebih dulu, kemudian baris setelahnya tetap dieksekusi — berbeda fundamental dari error() yang memutus alur.
Pola Validasi Input di Awal #
Praktik industri: validasi semua masukan sebelum pekerjaan berat dimulai. Rangkaian if + error() diletakkan di bagian paling atas sehingga masukan tidak valid langsung gagal cepat dengan pesan yang menjelaskan penyebabnya. Pola komponen:kejadian untuk identifier menjaga galat tetap terklasifikasi:
% Pola gagal-cepat: validasi sebelum komputasi
jumlahBaris = 0;
if jumlahBaris <= 0
error('demo:argumen', 'jumlahBaris harus positif, diterima %d', jumlahBaris);
end
fprintf('memproses %d baris data\n', jumlahBaris);Potongan tersebut menghentikan script dengan pesan jumlahBaris harus positif, diterima 0 — pengguna langsung tahu parameter mana yang salah tanpa perlu membaca stack trace. Pola ini paling bersinar di dalam function, tempat masukan datang dari pemanggil yang bisa saja keliru; kita praktikkan penuh di Section Fungsi.
Berkas contoh.m pada bagian bawah halaman memuat keempat pola: try/catch pembagian, rethrow dua lapis, warning + lastwarn, semuanya berjalan tuntas tanpa menghentikan script.
Ringkasan #
error('id:pesan', ...) melempar MException dan menghentikan eksekusi di tempat; try/catch err menangkap objek itu sehingga program dapat memilih tindakan penyelamatan. rethrow(err) melempar ulang galat tanpa mengubah identitasnya, warning() memberi sinyal tanpa memutus alur, dan validasi masukan di awal membuat kegagalan terjadi cepat dengan pesan yang jelas. Untuk detail galat, selalu gunakan err di catch, bukan lasterr.