switch dan try/catch

Percabangan banyak kasus dengan switch serta penanganan error dengan try/catch.

Daftar isi

Percabangan if menjadi sulit dibaca ketika satu nilai harus dibandingkan dengan banyak kasus, dan program yang membaca masukan dari luar selalu berpeluang menerima data yang tidak valid. Topik ini membahas pernyataan switch yang menyusun percabangan banyak kasus dalam satu blok ringkas, kemudian pernyataan try/catch yang menangkap error saat program berjalan tanpa menghentikan seluruh sesi. Setelah menguasai keduanya, fungsi validasi masukan dan pemrosesan data mentah dapat ditulis dengan alur yang tetap terkendali pada kondisi normal maupun saat terjadi kesalahan.

Percabangan banyak kasus dengan switch#

Pernyataan switch membandingkan satu nilai ekspresi terhadap daftar kasus dan menjalankan blok kasus yang cocok. Bentuknya dimulai dengan switch ekspresi, diikuti cabang case nilai sebanyak yang diperlukan, cabang otherwise untuk semua nilai yang tidak tercakup, dan ditutup end. Berbeda dengan bahasa C, MATLAB tidak memerlukan break karena hanya blok kasus yang cocok yang dijalankan. Kendali kemudian melompat ke akhir switch tanpa jatuh ke kasus berikutnya.

Contoh berikut menerjemahkan kode hari menjadi nama hari memakai lima kasus dan satu cabang otherwise.

matlab Contoh: percabangan switch atas kode hari
hari = 3;
switch hari
  case 1
    nama = 'Senin';
  case 2
    nama = 'Selasa';
  case 3
    nama = 'Rabu';
  case 4
    nama = 'Kamis';
  case 5
    nama = 'Jumat';
  otherwise
    nama = 'akhir pekan';
end
fprintf('kode %d adalah %s\n', hari, nama);
text Keluaran
kode 3 adalah Rabu

Nilai 3 cocok dengan kasus ketiga sehingga nama menerima teks Rabu, kemudian fprintf menampilkan hasilnya. Nilai 6 atau 7 akan melewati semua case dan mendarat di otherwise yang menampung akhir pekan. Struktur ini terbaca seperti daftar padanan yang tersusun dari atas ke bawah. Penambahan kasus baru cukup dilakukan dengan menyisipkan satu blok case, tanpa menambah tingkat if-elseif.

switch atas teks dan peran otherwise#

Pernyataan switch juga menerima ekspresi teks, dan perbandingannya bersifat tepat sama, bukan sekadar mirip. Pola ini umum dipakai untuk memetakan kode satuan, nama perintah, atau kategori yang sudah baku. Cabang otherwise tetap penting meskipun opsional karena nilai tak terduga tetap menghasilkan cabang yang jelas. Cabang tersebut dapat memanggil error secara sengaja untuk menolak masukan yang tidak dikenal.

matlab Contoh: percabangan switch atas teks satuan
satuan = 'cm';
switch satuan
  case 'm'
    faktor = 1;
  case 'cm'
    faktor = 0.01;
  case 'mm'
    faktor = 0.001;
  otherwise
    error('satuan "%s" belum dikenal', satuan);
end
fprintf('1 %s = %g m\n', satuan, faktor);
text Keluaran
1 cm = 0.01 m

Satuan cm cocok dengan kasus kedua sehingga faktor bernilai 0.01, lalu fprintf menampilkan hasil konversinya. Satuan seperti inci akan jatuh ke otherwise yang memanggil error dengan format %s. Program berhenti dengan pesan yang menyebut nilai yang ditolak, alih-alih melanjutkan dengan faktor yang salah. Perbandingan teks pada switch membedakan huruf besar dan kecil, sehingga cm dan CM adalah dua nilai yang berbeda.

Memilih antara switch dan if-elseif#

Kedua konstruksi dapat menggantikan satu sama lain, tetapi masing-masing punya wilayah yang paling alami. Pemilihan didasarkan pada bentuk perbandingannya, bukan selera semata.

KondisiKonstruksi yang cocok
Satu nilai dibandingkan dengan banyak konstantaswitch
Tiap cabang menguji ekspresi berbedaif/elseif
Perbandingan rentang seperti nilai > 80if/elseif
Pencocokan teks atau bilangan bulat kategoriswitch

Pernyataan switch hanya membandingkan kesamaan penuh terhadap nilai kasus, sehingga uji seperti rentang nilai atau kombinasi kondisi tetap memerlukan if. Sebaliknya, pemetaan kategori yang ditulis dengan if-elseif bertingkat lima lebih sulit diperiksa daripada versi switch-nya. Pembaca harus menelusuri tiap kondisi secara penuh untuk mengetahui nilai yang dibandingkan.

Penanganan error dengan try/catch#

Pernyataan try/catch menjalankan blok try, dan apabila terjadi error di dalamnya, kendali berpindah ke blok catch tanpa menghentikan program. Objek error ditangkap sebagai variabel, umumnya bernama e, yang menyimpan properti message berisi pesan error dan identifier berisi label kategorinya. Pola ini pas dipadukan dengan fungsi yang memvalidasi masukannya sendiri, seperti fungsi konversi suhu berikut yang menolak masukan negatif pada skala Kelvin.

matlab konversi_kelvin.m
function celsius = konversi_kelvin(kelvin)
% KONVERSI_KELVIN mengubah suhu Kelvin menjadi Celsius.
%   CELSIUS = KONVERSI_KELVIN(KELVIN) menerima suhu dalam satuan Kelvin
%   dan menghasilkan suhu dalam satuan Celsius. Masukan negatif ditolak
%   karena skala Kelvin tidak mengenal suhu di bawah nol mutlak.

  if any(kelvin(:) < 0)
    error('suhu:masukanTidakValid', ...
      'suhu %.1f K berada di bawah nol mutlak', min(kelvin(:)));
  end
  celsius = kelvin - 273.15;
end

Fungsi ini memeriksa seluruh elemen masukan lebih dahulu, lalu memanggil error dalam bentuk dua argumen, yaitu identifier suhu:masukanTidakValid dan pesan dengan specifier format %.1f. Pemanggil yang sadar akan kemungkinan masukan salah dapat membungkus panggilannya dalam try/catch seperti berikut.

matlab Contoh: menangkap error masukan tidak valid
try
  suhu_c = konversi_kelvin([-5, 300]);
  fprintf('konversi berhasil: %.2f C\n', suhu_c(2));
catch e
  fprintf('terjadi error: %s\n', e.message);
  fprintf('identifier: %s\n', e.identifier);
end
text Keluaran
terjadi error: suhu -5.0 K berada di bawah nol mutlak
identifier: suhu:masukanTidakValid

Elemen -5 memicu error pada validasi, sehingga blok try ditinggalkan dan kedua fprintf pada blok catch menampilkan pesan beserta identifiernya. Tanpa try/catch, error yang sama akan menghentikan skrip di titik itu. Pada masukan yang sah, blok catch tidak pernah dijalankan dan hasil konversi tampil seperti biasa.

matlab Contoh: jalur sukses tanpa penangkapan
c = konversi_kelvin(300);
fprintf('300 K sama dengan %.2f C\n', c);
text Keluaran
300 K sama dengan 26.85 C

Suhu 300 K lolos validasi sehingga fungsi menghasilkan 26.85 derajat Celsius dan tidak ada error yang perlu ditangkap. Kedua jalur ini memperlihatkan kontrak yang tegas: fungsi menolak masukan tidak valid dengan identifier yang stabil, dan pemanggil memutuskan sendiri apakah menangkap atau membiarkan error menghentikan alur.

Pola gagal-awal dan batas penangkapan#

Pola gagal-awal menempatkan seluruh pemeriksaan syarat di awal fungsi sebelum perhitungan dilakukan, sehingga error muncul cepat dengan pesan yang dekat dengan sumber masalahnya. Validasi yang ditunda ke tengah perhitungan membuat sebagian variabel sudah terisi dan pembaca pesan harus menebak langkah mana yang gagal. Penempatan try/catch mengikuti keputusan yang sama: tangkap error pada titik yang dapat memulihkan keadaan program, misalnya saat membaca satu berkas dari daftar dan melanjutkan pemrosesan sisanya. Sebaliknya, biarkan error yang tidak diketahui penanganannya tetap menghentikan program agar masalah tampak jelas saat pengembangan. Menangkap semua error hanya untuk menjaga program tetap berjalan berisiko menyimpan data setengah jadi dan menyembunyikan kesalahan logika yang justru perlu diperbaiki.

Kesalahan umum#

Kesalahan pertama adalah mengharapkan switch membandingkan rentang. Penulisan case nilai > 80 tidak menguji rentang, melainkan membandingkan nilai switch dengan hasil logika perbandingan itu, sehingga cabang tersebut hanya aktif untuk nilai switch yang tepat bernilai benar logika. Rentang tetap harus memakai if/elseif.

Kesalahan kedua adalah mengabaikan cabang otherwise pada data dari luar. Tanpa otherwise, nilai tak dikenal membuat variabel hasil tetap kosong, lalu error muncul jauh di hilir saat variabel itu dipakai, dengan pesan yang tidak menyebut penyebab aslinya. Otherwise yang memanggil error secara eksplisit menjaga kegagalan tetap terjadi di dekat sumbernya.

Kesalahan ketiga adalah menyerahkan identifier dan pesan dalam satu argumen error. Bentuk dua argumen error(id, pesan) tidak ambigu, sedangkan satu argumen yang mengandung titik dua ditafsirkan berbeda antar implementasi. Pada GNU Octave 9.4 yang dipakai untuk memverifikasi contoh jalur ini, argumen tunggal suhu:masukanTidakValid ditafsirkan sebagai identifier tanpa pesan dan memicu error call to error with message identifier 'suhu:masukanTidakValid' requires message. Menulis identifier sebagai argumen pertama yang terpisah menghindarkan seluruh perbedaan penafsiran tersebut.

Ringkasan#

  • switch membandingkan satu nilai terhadap banyak konstanta tanpa perlu break, dan hanya blok kasus yang cocok yang dijalankan.
  • Cabang otherwise menampung nilai tak terduga dan sebaiknya memanggil error secara eksplisit pada masukan dari luar.
  • try/catch menangkap error ke objek dengan properti message dan identifier, dan blok catch hanya dijalankan bila blok try gagal.
  • Pola gagal-awal memvalidasi syarat di awal fungsi, dan error ditangkap hanya pada titik yang tahu cara memulihkannya.

Referensi#

  • switch — MathWorks — dokumentasi resmi pernyataan switch beserta aturan pencocokan kasus dan perannya terhadap otherwise.
  • try, catch — MathWorks — dokumentasi resmi pernyataan try/catch beserta properti objek error yang ditangkap.
  • error — MathWorks — dokumentasi resmi fungsi error untuk bentuk identifier dan pesan yang dipisahkan argumen.