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:

matlab
% 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 tercapai

Saat 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:

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

Output yang Dihasilkan:

text
Galat ditangkap : Penyebut tidak boleh nol
Identifier      : demo:bagiNol

Mari kita bedah baris-baris kode di atas:

  1. Baris 3 (try): membuka wilayah terlindungi — galat apa pun di dalam blok ini tidak lagi menghentikan program.
  2. Baris 4-5 (if ... error(...)): validasi penyebut; karena penyebut bernilai 0, fungsi error() melempar MException dengan identifier demo:bagiNol.
  3. Baris 7-8 (hasilBagi ... fprintf): terlewati seluruhnya — lemparan galat memindahkan eksekusi langsung ke catch.
  4. Baris 9 (catch err): menangkap objek galat ke variabel err; baris-baris setelah blok catch tetap dijalankan normal.
  5. Baris 10-11 (err.message, err.identifier): kedua properti objek MException dicetak — 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:

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

Output yang Dihasilkan:

text
lapisan dalam melempar ulang galat
lapisan luar menangkap: Data mentah tidak ditemukan (demo:dataHilang)

Mari kita bedah baris-baris kode di atas:

  1. Baris 2-3 (try ... error): galat demo:dataHilang dilempar di lapisan terdalam.
  2. Baris 4-6 (catch err ... rethrow(err)): lapisan dalam mencatat kejadian lewat fprintf, lalu melempar ulang objek yang sama — bila rethrow diganti error baru, identifier bisa tidak sengaja berubah.
  3. 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:

matlab
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):

text
Warning: Stok menipis: 3 unit tersisa
program tetap berlanjut sampai selesai

Peringatan 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:

matlab
% 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.