Apa itu try, on, catch, dan finally di Dart ?
Tags: dart, indonesia, exception
Published: 2021-12-03 15:08:50

Hallowww semua, di artikel ini saya coba membahas mengenai Exception Handling di bahasa Dart.

Apa itu **Exception Handling** ? ini merupakan cara komputer untuk mengelola error. Jadi saat bikin program itu tidak semuanya akan berjalan mulus, nanti pasti ada error yang harus kita kelola.

Pada kondisi apa terjadi error ? Umumnya exception handling digunakan saat:
- Tipe data tidak sesuai
- Method / property tidak ditemukan
- Error saat membaca file / IO
- Kesalahan jaringan saat melakukan request / response
- (...tambahkan dikolom komentar yaa hehe)

Di Dart sendiri sudah disediakan fitur exception handling, dan caranya pun mirip seperti bahasa pemrograman lainnya. Konsep utama dari exception handling adalah try-catch.

## try-catch
`try` merupakan tahapan awal untuk menjalankan exception handling. Sedangkan `catch` digunakan untuk menerima errornya.

Contoh programnya :

```dart
try {
  // Kode disini akan berjalan pertama kali
  print("Proses...");
  dynamic name = 20;
  print(name.length); // Awww error !
  print("Finish !"); // Kode tidak dijalankan
} catch (err) {
  print("Terjadi kesalahan");
}
```
Program diatas akan mengeluarkan error karena property `length` itu tidak ada di variable `name`.

Jadi cara kerjanya adalah pertama kode blok yang ada di dalam `try` akan dijalankan terlebih dahulu. Ketika terjadi error maka akan langsung lompat ke blok `catch`.

Output:
![try-catch exception](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bsuahciylcdxh2t0ei0.png)

Kode program `print("Finish !");` tidak dijalankan.

## on
Dari bahasa yang saya pelajari sepertinya, Dart ini membuat konsep baru pada Exception Handling, karena pada umumnya yang tersedia hanyalah `try`, `catch`, dan `finally` tapi di Dart ini ada `on`.

Jadi apa itu `on` pada Dart ? `on` digunakan untuk mengelola error berdasarkan jenis errornya. Di kode sebelumnya kita hanya menggunakan `try-catch` saja yang dimana semua error akan masuk ke dalam `catch`.

Kode program diatas kita jalankan ulang tapi dengan print yang berbeda:
```dart
try {
  // Kode disini akan berjalan pertama kali
  print("Proses...");
  dynamic name = 20;
  print(name.length); // Awww error !
  print("Finish !"); // Kode tidak dijalankan
} catch (err) {
  print("Terjadi kesalahan");
  print(err.toString()); // Kode program baru
}
```

Outputnya adalah:
![Output error](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0hfmdabcltrbnglbhetw.png)

Dari gambar diatas kita melihat ada error dengan jenis `NoSuchMethodError`. Dari [dokumentasinya](https://api.dart.dev/stable/2.14.4/dart-core/NoSuchMethodError-class.html), dituliskan:

> ...corresponding to a failed method call

Artinya error `NoSuchMethodError` adalah jenis error yang digunakan ketika method pada variabel tidak ada. Ini terjadi akibat property / method `length` tidak ada di variabel `name`.

### Terus dimana `on` nya ?
Nahh disini kita bisa menerapkan keyword `on`. Maka programnya menjadi:
```dart
try {
  // Kode disini akan berjalan pertama kali
  print("Proses...");
  dynamic name = 20;
  print(name.length); // Awww error !
  print("Finish !"); // Kode tidak dijalankan
} on NoSuchMethodError {
  // Kode program yang dialam `on` ini yang akan dijalankan
  print("Method tidak ditemukan");
} catch (err) {
  // Tidak dijalankan
  print("Terjadi kesalahan");
  print(err.toString());
}
```

Output:
![Error handling dengan on](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/94kls5a86ea3db60r0qc.png)

Sekarang yang keluar adalah `Method tidak ditemukan` bukan `Terjadi kesalahan`. Kok iso ? itu karena jenis error nya adalah `NoSuchMethodError` jadi kode program yang ada didalam `on NoSuchMethodError ` itulah yang akan dijalankan.

## finally
`finally` akan dijalankan ketika semua proses selesai, baik itu ada error atau tidak.

Contoh program ketika ada error:
```dart
try {
  // Kode disini akan berjalan pertama kali
  print("Proses...");
  dynamic name = 20;
  print(name.length); // Awww error !
  print("Finish !"); // Kode tidak dijalankan
} catch (err) {
  print("Terjadi kesalahan");
} finally {
  print("Proses try-catch selesai");
}
```
Output program:
![finally saat ada error](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z5v67tzv183rpxdlqkqr.png)

Contoh kode program ketika tidak ada error:
```dart
try {
  // Kode disini akan berjalan pertama kali
  print("Proses...");
  dynamic name = 20;
  print(name);
  print("Finish !"); // Berjalan
} catch (err) {
  print("Terjadi kesalahan");
} finally {
  print("Proses try-catch selesai");
}
```

Output program:
![finally ketika tidak ada error](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nwt6ouuzok2t5nibqw7.png)

### Wait, kenapa harus pakai `finally` ?
Bukankah sama aja ketika kita tidak menggunakan `finally` ?
![Penasaran](https://media.giphy.com/media/6J6uBnTbbwAOMZRMnN/giphy.gif)

Okee kita coba kalau tanpa finally yaa. Jadi programnya:
```dart
try {
  // Kode disini akan berjalan pertama kali
  print("Proses...");
  dynamic name = 20;
  print(name.length); // Awww error !
  print("Finish !"); // Kode tidak dijalankan
} catch (err) {
  print("Terjadi kesalahan");
}

print("Proses try-catch selesai");
```

Output program:
![tanpa finally](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/84vdr422zak3oq1yha39.png)

Ehhh, iyaa juga yaaa...
![hehehehe](https://media.giphy.com/media/kGCuRgmbnO9EI/giphy.gif)

Eitss, `finally` ini biasanya digunakan untuk membuat program kita lebih konsisten. Umumnya digunakan ketika:
- Selesai terhubung ke database
- Membersihkan memori

Sumber https://stackoverflow.com/a/16705037/9905881

Okee deh mungkin itu saja, untuk pembahasan mengenai error / exception handling di bahasa Dart. Kalau kalian memiliki saran / kritikan silahkan komentar yaa 😉

Terima kasih sudah membaca ~