unisbadri.com » Python Java Golang Typescript Kotlin Ruby Rust Dart PHP
Eksepsi

Eksepsi #

Dalam pengembangan perangkat lunak, menangani kesalahan (eksepsi) adalah bagian penting untuk memastikan bahwa aplikasi Anda berjalan dengan lancar dan dapat menangani situasi tak terduga secara efektif. Dalam Dart, eksepsi adalah peristiwa yang terjadi selama eksekusi program yang mengganggu aliran normal dari instruksi program. Dart menyediakan beberapa mekanisme untuk menangani eksepsi, memungkinkan Anda untuk menangkap dan mengatasi kesalahan dengan cara yang terkontrol.

Dasar Penanganan Eksepsi #

Eksepsi dalam Dart adalah objek yang mengimplementasikan kelas Exception atau Error. Ketika eksepsi terjadi, Dart akan menghentikan eksekusi normal dan mencari handler (penangan) eksepsi yang sesuai.

try, catch, dan finally #

  • try: Blok try digunakan untuk membungkus kode yang berpotensi menimbulkan eksepsi.
  • catch: Blok catch digunakan untuk menangani eksepsi yang terjadi dalam blok try. Anda dapat menangkap eksepsi tertentu atau menangkap semua eksepsi.
  • finally: Blok finally digunakan untuk menjalankan kode yang akan dieksekusi setelah blok try dan catch, terlepas dari apakah eksepsi terjadi atau tidak.

Contoh Sederhana:

void main() {
  try {
    int hasil = 10 ~/ 0; // Membagi dengan nol akan menimbulkan eksepsi
  } catch (e) {
    print('Terjadi eksepsi: $e');
  } finally {
    print('Ini akan selalu dieksekusi.');
  }
}

Pada contoh di atas, eksepsi yang terjadi karena pembagian dengan nol ditangkap oleh blok catch, dan pesan eksepsi dicetak ke konsol. Blok finally dieksekusi setelah penanganan eksepsi.

Menangkap Eksepsi Tertentu #

Anda bisa menangkap eksepsi tertentu menggunakan tipe eksepsi dalam blok catch.

Contoh:

void main() {
  try {
    int hasil = 10 ~/ 0;
  } on IntegerDivisionByZeroException catch (e) {
    print('Terjadi kesalahan: Pembagian dengan nol.');
  } catch (e) {
    print('Terjadi eksepsi yang tidak diketahui: $e');
  } finally {
    print('Blok finally dieksekusi.');
  }
}

Pada contoh di atas, eksepsi IntegerDivisionByZeroException ditangkap secara spesifik. Jika eksepsi lain terjadi, itu akan ditangani oleh blok catch umum.

Melempar Eksepsi #

Dalam Dart, Anda bisa melempar eksepsi secara manual menggunakan kata kunci throw. Ini memungkinkan Anda untuk secara eksplisit memicu eksepsi di mana saja dalam kode Anda.

Contoh:

void cekNilai(int nilai) {
  if (nilai < 0) {
    throw ArgumentError('Nilai tidak boleh negatif: $nilai');
  } else {
    print('Nilai valid: $nilai');
  }
}

void main() {
  try {
    cekNilai(-5);
  } catch (e) {
    print('Terjadi eksepsi: $e');
  }
}

Pada contoh di atas, jika nilai yang diberikan negatif, eksepsi ArgumentError dilempar, yang kemudian ditangkap oleh blok catch dalam fungsi main.

Penanganan Eksepsi dengan rethrow #

Terkadang, setelah menangkap eksepsi, Anda mungkin ingin melempar ulang eksepsi tersebut ke atas untuk ditangani oleh handler lain. Anda bisa menggunakan kata kunci rethrow untuk melempar ulang eksepsi yang sudah ditangkap.

Contoh:

void fungsiA() {
  try {
    throw FormatException('Format salah');
  } catch (e) {
    print('Ditangkap di fungsiA: $e');
    rethrow; // Melempar ulang eksepsi
  }
}

void main() {
  try {
    fungsiA();
  } catch (e) {
    print('Ditangkap di main: $e');
  }
}

Pada contoh di atas, eksepsi FormatException ditangkap dalam fungsiA dan kemudian dilempar ulang ke main, di mana ia ditangkap lagi.

Membuat Eksepsi Kustom #

Dalam Dart, Anda juga dapat membuat eksepsi kustom dengan mendefinisikan kelas Anda sendiri yang mengimplementasikan Exception atau Error.

Contoh:

class NilaiNegatifException implements Exception {
  String pesan;
  NilaiNegatifException(this.pesan);

  @override
  String toString() {
    return "NilaiNegatifException: $pesan";
  }
}

void cekNilai(int nilai) {
  if (nilai < 0) {
    throw NilaiNegatifException('Nilai tidak boleh negatif: $nilai');
  } else {
    print('Nilai valid: $nilai');
  }
}

void main() {
  try {
    cekNilai(-10);
  } catch (e) {
    print('Terjadi eksepsi: $e');
  }
}

Pada contoh di atas, NilaiNegatifException adalah eksepsi kustom yang digunakan untuk menangani kasus di mana nilai yang diberikan negatif.

Error vs. Exception #

Dalam Dart, ada perbedaan antara Exception dan Error:

  • Exception: Biasanya digunakan untuk kondisi yang diharapkan dan bisa ditangani oleh kode (misalnya, pembagian dengan nol, format yang salah, nilai argumen tidak valid).
  • Error: Biasanya digunakan untuk kondisi yang tidak diharapkan dan lebih serius (misalnya, OutOfMemoryError, StackOverflowError). Error biasanya tidak diharapkan untuk ditangani dalam kode, kecuali dalam situasi khusus.

Contoh Error:

void main() {
  try {
    List<int> angka = [];
    print(angka[1]); // Menyebabkan RangeError
  } catch (e) {
    print('Terjadi error: $e');
  }
}

Dalam contoh ini, RangeError adalah jenis Error yang terjadi ketika Anda mencoba mengakses indeks yang tidak ada dalam daftar.

Asynchronous Error Handling #

Dalam Dart, penanganan eksepsi untuk kode asynchronous (misalnya, Future dan async/await) sedikit berbeda. Eksepsi yang terjadi dalam operasi asynchronous harus ditangani dengan try-catch dalam blok async.

Contoh:

Future<void> fetchData() async {
  try {
    // Misalkan terjadi kesalahan dalam pemanggilan API
    throw Exception('Gagal mendapatkan data');
  } catch (e) {
    print('Terjadi eksepsi: $e');
  }
}

void main() async {
  await fetchData();
}

Pada contoh di atas, eksepsi yang terjadi dalam operasi asynchronous ditangkap oleh blok try-catch dalam fungsi async.

Kesimpulan #

Penanganan eksepsi dalam Dart adalah fitur penting yang membantu Anda menulis kode yang lebih andal dan mudah dipelihara. Dengan menggunakan try, catch, finally, throw, rethrow, dan membuat eksepsi kustom, Anda bisa menangani berbagai situasi kesalahan dalam aplikasi Anda. Selain itu, memahami perbedaan antara Exception dan Error serta cara menangani eksepsi dalam kode asynchronous akan membuat aplikasi Anda lebih kuat dan tangguh terhadap kesalahan.

« Interface
List »