Saat program berhenti tiba-tiba, reaksi pertama kebanyakan orang adalah panik dan segera mengubah kode secara acak. Padahal MATLAB sudah menyerahkan laporan investigasi yang terstruktur: pesan galat, lokasi baris, sampai jejak pemanggilan fungsi yang menimbulkan masalah. Keterampilan debugging termurah — namun paling sering dilupakan — adalah membaca laporan itu sampai tuntas sebelum menyentuh satu baris kode pun. Chapter ini melatih kita membedah anatomi error message, mengenali empat pola galat yang paling sering muncul, dan membaca stack trace dari dalam ke luar.
Anatomi Sebuah Error Message #
Aturannya sederhana: galat runtime menghentikan eksekusi, lalu MATLAB mencetak laporan di Command Window. Laporan itu selalu punya tiga komponen yang bisa kita andalkan — header sumber galat, teks pesan, dan lokasi (berkas + baris). Mari kita pelajari bentuk paling sederhana, galat indexing yang terjadi langsung di Command Window:
data = [10 20 30];
data(7)Transkripsi Command Window MATLAB:
>> data(7)
Index exceeds matrix dimensions.Karena galat terjadi di tingkat atas (bukan di dalam fungsi), MATLAB hanya mencetak pesannya. Bentuk yang lebih khas muncul ketika galat bersumber dari operator atau built-in function:
matriksA = [1 2 3];
vektorB = [4; 5];
hasil = matriksA * vektorBTranskripsi Command Window MATLAB:
>> hasil = matriksA * vektorB
Error using *
Inner matrix dimensions must agree.Baris Error using * adalah header sumber: operator * yang melempar galat. Baris kedua adalah pesan: dimensi dalam kedua operand tidak cocok — [1 2 3] berukuran 1×3, [4; 5] berukuran 2×1, sehingga perkalian matriks tidak terdefinisi. Ketika galat terjadi di dalam berkas kita sendiri, muncul komponen ketiga — stack trace. Berkas sumber chapter ini menyertakan fungsi konversi_suhu() yang melempar galat validasi:
suhu = konversi_suhu('dua puluh')Transkripsi Command Window MATLAB:
>> suhu = konversi_suhu('dua puluh')
Error using konversi_suhu (line 6)
Input harus berupa angka dan tidak kosongBentuk Error using <nama> (line N) menunjuk fungsi dan baris tempat error() dipanggil. Jika pemanggilnya adalah script atau fungsi lain, frame tambahan Error in <pemanggil> (line M) dicetak di bawahnya lengkap dengan baris kode sumbernya. Dalam bentuk laporan MException.getReport() dan tampilan dbstack, frame yang sama ditulis sebagai In <nama> (line N) — maknanya identik: baris mana di berkas mana yang sedang berjalan saat galat terjadi.
Identifier Galat #
Setiap galat MATLAB membawa identifier — label bertingkat format MATLAB:komponen:kejadian yang tersimpan di properti err.identifier. Identifier memudahkan kita menyaring galat berdasarkan sumbernya, misalnya saat memasang error breakpoint spesifik di chapter Breakpoints. Tiga identifier yang paling sering kita jumpai:
| Identifier | Pesan yang menyertainya |
|---|---|
MATLAB:badsubscript | Index exceeds matrix dimensions. |
MATLAB:innerdim | Inner matrix dimensions must agree. |
MATLAB:UndefinedFunction | Undefined function or variable 'x'. |
Empat Galat yang Paling Sering Muncul #
Sebagian besar galat pemula jatuh ke empat pola berikut. Kenali polanya, dan perbaikan jadi setengah selesai:
| Pesan galat | Contoh pemicu | Penyebab umum | Perbaikan cepat |
|---|---|---|---|
Index exceeds matrix dimensions. | data(7) saat data hanya 3 elemen | indeks melebihi batas array | cek numel() / size() sebelum indexing |
Error using * Inner matrix dimensions must agree. | [1 2 3] * [4; 5] | dimensi dalam operand tidak cocok | gunakan .' untuk transpose, atau .* untuk elemen-per-elemen |
Undefined function or variable 'x'. | variabel belum dibuat atau salah eja | nama tidak ditemukan di path | cek ejaan; cek which namaFungsi dan exist('x') |
Unable to perform assignment because the size of the left side is 1-by-2 and the size of the right side is 1-by-3. | v(1:2) = [1 2 3] | jumlah elemen kiri ≠ kanan | samakan ukuran kedua sisi sebelum assignment |
Perhatikan pola Undefined function or variable: galat ini muncul baik untuk fungsi maupun variabel. Jika nama itu variabel, variabelnya belum pernah dibuat di workspace; jika itu fungsi, berkasnya tidak ada di search path — perintah which akan memberi tahu lokasi berkas yang ditemukan MATLAB.
Membaca Stack Trace dari Dalam ke Luar #
Ketika galat ditangkap, objek MException menyimpan properti stack: struct array berisi name, file, line, dan column untuk setiap frame pemanggilan. stack(1) adalah frame terdalam — lokasi galat terjadi; stack(end) adalah frame terluar — titik masuk script atau Command Window. Aturan bacanya: mulai dari stack(1) ke atas, karena penyebab langsung hampir selalu ada di frame terdalam.
Diagram di atas memperlihatkan hubungan kedua frame pada contoh konversi_suhu(): panah menunjukkan arah pemanggilan, sedangkan pembacaan stack berjalan berlawanan — dari stack(1) menuju stack(2).
warning() vs error() #
Dari tampilannya saja kita bisa membedakan dua jenis laporan. error() mencetak laporan merah dan menghentikan eksekusi; warning() mencetak Warning: berwarna oranye dan melanjutkan eksekusi. Keduanya sudah kita bahas tuntas di chapter Error Handling Dasar; di sini cukup diingat prinsip membacanya — pesan Warning: adalah kondisi mencurigakan yang program pilih abaikan, sementara laporan galat adalah kondisi yang memaksa program berhenti. Jika satu baris stack muncul di bawah sebuah Warning:, baris itu menunjuk lokasi warning() dipanggil, bukan lokasi masalah sebenarnya — penyebabnya biasanya beberapa baris di atasnya.
Membedah Galat dari dalam Kode #
Semua anatomi di atas bisa kita akses secara terprogram lewat objek MException di blok catch. Berkas contoh.m pada bagian Berkas Sumber menangkap dua galat — satu dari dalam fungsi konversi_suhu(), satu dari script — lalu mencetak identifier, message, dan stack ringkasnya lewat fungsi cetak_anatomi():
% contoh.m — inti alurnya
fprintf('=== Anatomi galat 1: dilempar dari dalam fungsi ===\n');
try
suhu = konversi_suhu('dua puluh');
catch err
cetak_anatomi(err);
endOutput yang Dihasilkan:
=== Anatomi galat 1: dilempar dari dalam fungsi ===
identifier : demo:input
message : Input harus berupa angka dan tidak kosong
stack : 2 frame (dibaca dari dalam ke luar)
1. konversi_suhu (line 6)
2. contoh (line 7)Mari kita bedah baris-baris kode di atas:
- Baris 2 (
fprintf ... ===): mencetak judul bagian agar posisi laporan mudah dilacak saat output digulir. - Baris 3 (
try): membuka wilayah terlindungi — galat dari pemanggilankonversi_suhu()tidak lagi menghentikan script. - Baris 4 (
suhu = konversi_suhu(...)): argumen'dua puluh'(char) gagal validasiisnumeric, sehingga fungsi melemparMExceptionber-identifierdemo:input; framestack(1)menunjuk baris 6 dikonversi_suhu.m, framestack(2)menunjuk baris pemanggilan ini. - Baris 5-6 (
catch err ... cetak_anatomi(err)): objek galat ditangkap lalu digiling oleh fungsi pelaporan yang mencetak ketiga komponen anatomi — identifier, message, stack.
Output yang Dihasilkan (lanjutan, galat yang dilempar langsung dari script):
=== Anatomi galat 2: dilempar dari script ===
identifier : MATLAB:innerdim
message : Inner matrix dimensions must agree.
stack : 1 frame (dibaca dari dalam ke luar)
1. contoh (line 15)
Program tuntas — dua galat tertangkap, tidak ada crash.Pada kasus kedua, stack hanya berisi satu frame — contoh sendiri — karena error() dipanggil di tingkat atas script, bukan di dalam fungsi. Di MATLAB, fungsi bawaan err.getReport('basic') menghasilkan laporan siap-baca dengan format yang sama; fungsi tersebut belum tersedia di Octave sehingga cetak_anatomi() kita mencetak komponennya secara manual.
Ringkasan #
Error message MATLAB punya anatomi tetap: header sumber (Error using <fungsi>), teks pesan, dan stack Error in <berkas> (line N) — versi terprogramnya tersimpan di err.message, err.identifier, dan err.stack. Empat pola galat paling umum adalah indexing di luar batas, dimensi matriks tak cocok, nama tak terdefinisi, dan assignment beda ukuran. Baca stack dari frame terdalam (stack(1)) ke luar, bedakan Warning: dari galat sejati, dan manfaatkan identifier seperti MATLAB:badsubscript untuk menyaring galat secara otomatis. Chapter berikutnya melangkah dari membaca laporan menjadi menghentikan program tepat di lokasi masalah dengan debugger.