Penanganan Error (Exception)

try/catch/on/finally, throw, Exception vs Error, membuat exception kustom, rethrow, dan praktik penanganan error yang baik.

Part 14 dari 20 ± 40 menit Gratis

Program bisa gagal, dan itu wajar

File tidak ditemukan, input bukan angka, internet putus. Program yang baik tidak langsung crash, melainkan menangani kegagalan itu dengan anggun. Di Dart, kegagalan dilaporkan lewat exception.

try / catch

try {
  int angka = int.parse('abc');       // melempar FormatException
  print(angka);
} catch (e) {
  print('Terjadi masalah: $e');
}

Kode di blok try dijalankan; bila ada exception, eksekusi lompat ke catch.

on: menangkap jenis tertentu

try {
  var hasil = 10 ~/ 0;
} on IntegerDivisionByZeroException {
  print('Tidak bisa dibagi nol');
} on FormatException catch (e) {
  print('Format salah: ${e.message}');
} catch (e, stack) {
  print('Error lain: $e');
  print(stack);                      // jejak pemanggilan
} finally {
  print('Selalu dijalankan');        // berjalan sukses maupun gagal
}
  • on Tipe — hanya menangkap exception jenis itu.
  • catch (e) — menangkap semuanya; (e, stack) memberi jejak.
  • finally — pembersihan (menutup berkas, koneksi) yang pasti jalan.
  • Urutkan dari yang paling spesifik ke yang paling umum.

Melempar exception sendiri

double bagi(double a, double b) {
  if (b == 0) {
    throw ArgumentError('Pembagi tidak boleh nol');
  }
  return a / b;
}

try {
  bagi(1, 0);
} on ArgumentError catch (e) {
  print(e.message);
}

Exception vs Error

ExceptionError
ArtinyaKondisi tak terduga yang bisa dipulihkanBug dalam kode
ContohFormatException, IOException, TimeoutExceptionRangeError, ArgumentError, StateError
Ditangani?Ya, biasanyaSebaiknya diperbaiki, bukan ditangkap

Exception kustom

Buat class sendiri agar penyebab kegagalan jelas dan bisa ditangani terpisah:

class SaldoTidakCukup implements Exception {
  final double kurang;
  SaldoTidakCukup(this.kurang);

  @override
  String toString() => 'Saldo kurang Rp $kurang';
}

class Rekening {
  double _saldo;
  Rekening(this._saldo);

  void tarik(double jumlah) {
    if (jumlah > _saldo) throw SaldoTidakCukup(jumlah - _saldo);
    _saldo -= jumlah;
  }
}

try {
  Rekening(50000).tarik(80000);
} on SaldoTidakCukup catch (e) {
  print(e);                              // Saldo kurang Rp 30000.0
}

rethrow: tangani sebagian, teruskan sisanya

try {
  prosesData();
} catch (e) {
  print('Mencatat error ke log: $e');
  rethrow;                               // lempar ulang agar pemanggil tahu
}

Alternatif exception: nilai kembalian

Untuk kegagalan yang sering dan wajar (misalnya input pengguna salah), sering lebih rapi mengembalikan null atau record:

int? angka = int.tryParse(teks);                 // null bila gagal
if (angka == null) print('Bukan angka');

(bool, String) validasi(String email) =>
    email.contains('@') ? (true, '') : (false, 'Email tidak valid');

Praktik yang baik

  • Tangkap exception spesifik; hindari catch (e) kosong yang menelan error diam-diam.
  • Jangan memakai exception untuk alur normal.
  • Pesan error harus membantu: apa yang gagal dan mengapa.
  • Tutup sumber daya di finally.

Error umum

  • Unhandled exception: FormatException → tidak ada try/catch di sekitar int.parse.
  • Menangkap Exception tetapi yang dilempar adalah Error → on Exception tidak menangkap Error.
  • Exceptions must derive from Exception or Error bukan syarat, tetapi throw string tidak disarankan; lempar objek exception.

Praktikkan langsung, gratis

Tulis dan jalankan kode langsung di browser, dapatkan penilaian otomatis. Daftar gratis kapan saja untuk menyimpan progres dan meraih sertifikat.

Coba latihan sekarang, tanpa daftar
Bagikan: WhatsApp Facebook LinkedIn X