Masukkan Password
26 2.12 Exception Handling in Dart Programming Language | Try Catch | Learn Dart Language | Dart Course
Pada materi ini kita masuk ke topik Exception Handling di Dart, yaitu bagaimana cara membuat program tetap berjalan dengan baik ketika terjadi error saat program sedang dijalankan.
Catatan kecil: di transkrip ada beberapa salah tangkap suara. βDOTβ maksudnya Dart, dan βTri/CAD/CATβ maksudnya
try/catch. βFormate exceptionβ maksudnyaFormatException, sedangkan βHTTP exceptionβ maksudnyaHttpException.
1. Apa itu Exception?
Exception adalah kondisi error yang terjadi ketika program sedang dijalankan (runtime).
Contoh sederhana:
int a = 10;
print(a ~/ 0);
Operator ~/ digunakan untuk integer division atau pembagian bilangan bulat.
Masalahnya:
10 / 0
tidak diperbolehkan.
Ketika kode tersebut dijalankan, Dart akan menghasilkan exception seperti:
IntegerDivisionByZeroException
Akibatnya, kalau exception tersebut tidak ditangani, program dapat berhenti pada bagian tersebut.
2. Kenapa Exception Handling diperlukan?
Bayangkan kita membuat aplikasi yang meminta user memasukkan angka.
Misalnya program mengharapkan:
Masukkan umur: 20
Tetapi user memasukkan:
abc
Program mungkin mengalami error karena abc bukan angka.
Kalau semua error seperti ini dibiarkan, program bisa berhenti secara tidak normal.
Karena itu kita membutuhkan exception handling.
Tujuannya adalah:
Menangani error sehingga program dapat merespons error dengan baik, daripada langsung berhenti secara tidak terkontrol.
Misalnya daripada program berhenti, kita bisa memberikan pesan:
Input tidak valid. Silakan masukkan angka.
3. try dan catch
Dart menyediakan mekanisme utama untuk menangani exception menggunakan:
try {
// kode yang mungkin menghasilkan exception
} catch (e) {
// kode untuk menangani exception
}
Ada dua bagian penting:
try
Berisi kode yang berpotensi menghasilkan exception.
catch
Dijalankan apabila terjadi exception di dalam try.
Secara sederhana:
TRY
β
Jalankan kode
β
Apakah ada exception?
βββ Tidak β lanjut
βββ Ya β CATCH
4. Contoh try-catch
Contoh dari materi:
void main() {
int a = 10;
try {
print(a ~/ 0);
} catch (e) {
print(e);
}
}
Mari kita perhatikan.
Langkah 1
int a = 10;
Kita membuat variabel:
a = 10
Langkah 2
Program masuk ke:
try {
print(a ~/ 0);
}
Dart mencoba menjalankan:
a ~/ 0
atau:
10 dibagi 0
Langkah 3
Terjadi exception.
Karena exception terjadi di dalam try, Dart tidak melanjutkan eksekusi normal pada blok try.
Dart berpindah ke:
catch (e)
Langkah 4
Kemudian:
print(e);
mencetak informasi exception.
Misalnya:
IntegerDivisionByZeroException
Jadi alurnya:
try
β
10 ~/ 0
β
ERROR / EXCEPTION
β
catch
β
print(e)
5. Apa itu e di catch (e)?
Perhatikan:
catch (e) {
print(e);
}
e adalah variabel yang berisi exception yang terjadi.
Kita bisa menganggap:
e
sebagai:
“Simpan informasi tentang error yang terjadi ke variabel
e.”
Contohnya:
try {
print(10 ~/ 0);
} catch (e) {
print(e);
}
e akan berisi exception yang terjadi.
Kemudian:
print(e);
digunakan untuk melihat informasi exception tersebut.
6. Bagaimana kalau tidak terjadi exception?
Ini juga penting.
Misalnya:
void main() {
int a = 10;
try {
print(a ~/ 2);
} catch (e) {
print(e);
}
}
Karena:
10 ~/ 2
valid, tidak ada exception.
Maka:
try β dijalankan
catch β TIDAK dijalankan
Output:
5
Jadi aturan sederhananya:
| Kondisi | try | catch |
|---|---|---|
| Tidak ada error | β | β |
| Ada exception | β sampai titik error | β |
7. finally
Selain try dan catch, Dart juga memiliki:
finally
Bentuk lengkapnya:
try {
// kode
} catch (e) {
// menangani error
} finally {
// selalu dijalankan
}
Hal paling penting yang harus diingat:
finallyakan dijalankan baik terjadi exception maupun tidak.
8. Contoh finally
void main() {
try {
print(10 ~/ 0);
} catch (e) {
print(e);
} finally {
print("Finally always be executed");
}
}
Alurnya:
try
β
10 ~/ 0
β
exception
β
catch
β
print exception
β
finally
β
print "Finally always be executed"
Output kurang lebih:
IntegerDivisionByZeroException
Finally always be executed
Jadi walaupun ada error, finally tetap dijalankan.
9. Bagaimana kalau TIDAK ada error?
Misalnya:
try {
print(10 ~/ 2);
} catch (e) {
print(e);
} finally {
print("Finally always be executed");
}
Tidak ada exception.
Maka:
try β dijalankan
catch β dilewati
finally β dijalankan
Output:
5
Finally always be executed
Jadi finally benar-benar digunakan untuk kode yang harus dijalankan pada kedua kondisi.
10. Kapan finally biasanya digunakan?
Dalam program nyata, finally sering digunakan untuk melakukan cleanup.
Misalnya kita membuka sesuatu yang harus ditutup kembali.
Konsepnya:
try {
// gunakan resource
} catch (e) {
// tangani error
} finally {
// bersihkan / tutup resource
}
Contohnya secara konsep:
Buka file
β
Gunakan file
β
Ada error?
βββββββββ΄ββββββββ
Ya Tidak
β β
catch lanjut
βββββββββ¬ββββββββ
β
finally
β
Tutup/bersihkan
11. Kita juga bisa membuat exception sendiri
Bagian berikutnya dari materi cukup penting.
Exception tidak selalu muncul secara otomatis.
Kita juga bisa melempar exception sendiri menggunakan:
throw
Contohnya:
int a = 10;
if (a > 5) {
throw FormatException();
}
Artinya:
Jika
alebih besar dari 5, buat/lempar sebuahFormatException.
Karena:
a = 10
dan:
10 > 5
adalah true, maka:
throw FormatException();
akan dijalankan.
12. Apa itu throw?
throw dapat dipahami sebagai:
“Saya sengaja memberi tahu Dart bahwa terjadi kondisi error.”
Misalnya:
if (age < 0) {
throw Exception("Age cannot be negative");
}
Kita mengatakan:
Kalau umur kurang dari 0,
anggap itu sebagai error.
Jadi throw sering digunakan untuk membuat aturan validasi kita sendiri.
13. throw + try-catch
Biasanya throw dipakai bersama try-catch.
Contohnya:
void main() {
try {
int a = 10;
if (a > 5) {
throw FormatException();
}
} catch (e) {
print(e);
}
}
Alurnya:
a = 10
β
a > 5 ?
β
true
β
throw FormatException
β
catch
β
print(e)
Jadi kita sendiri yang membuat exception terjadi berdasarkan kondisi tertentu.
14. Kenapa perlu membuat exception sendiri?
Karena tidak semua kondisi yang salah otomatis dianggap error oleh Dart.
Misalnya:
int age = -10;
Secara teknis Dart bisa saja menyimpan:
age = -10
Tidak ada error dari sisi bahasa.
Tetapi dari sisi aturan aplikasi, umur -10 mungkin tidak masuk akal.
Kita bisa membuat aturan:
if (age < 0) {
throw Exception("Age cannot be negative");
}
Sekarang kita sendiri yang menentukan:
“Kalau umur negatif, anggap sebagai exception.”
15. Contoh HttpException
Di materi juga ada contoh:
int signals = 0;
if (signals < 1) {
throw HttpException("No internet");
}
Maksudnya kira-kira:
Jika jumlah/kondisi sinyal kurang dari 1, kita anggap koneksi internet bermasalah dan melempar
HttpException.
Kemudian exception tersebut dapat ditangkap:
try {
int signals = 0;
if (signals < 1) {
throw HttpException("No internet");
}
} catch (e) {
print(e);
}
Outputnya bisa berisi pesan:
HttpException: No internet
16. Kenapa exception bisa diberi pesan?
Perhatikan:
throw HttpException("No internet");
Ada:
"No internet"
Pesan tersebut membantu kita mengetahui apa masalahnya.
Contoh lain:
throw Exception("Username is empty");
atau:
throw Exception("Password is too short");
atau:
throw Exception("Insufficient balance");
Pesan tersebut membuat error lebih mudah dipahami.
17. Exception vs Error biasa
Ini konsep yang bagus untuk dipahami.
Misalnya:
int a = 10;
Ini normal.
Kemudian:
print(a ~/ 0);
Dart menemukan kondisi yang tidak valid saat program berjalan β exception.
Sementara kita juga bisa sengaja membuat exception:
if (a > 5) {
throw Exception("a is too large");
}
Jadi exception bisa:
- Terjadi karena operasi tertentu bermasalah, atau
- Sengaja kita
throwkarena aturan aplikasi kita tidak terpenuhi.
18. Struktur lengkap Exception Handling
Secara umum:
try {
// kode yang mungkin menghasilkan exception
} catch (e) {
// menangani exception
} finally {
// selalu dijalankan
}
Kita bisa mengingatnya seperti ini:
try
“Coba jalankan kode ini.”
catch
“Kalau terjadi masalah, tangani di sini.”
finally
“Apa pun yang terjadi, jalankan bagian ini.”
throw
“Saya ingin melempar exception sekarang.”
19. Contoh lengkap
Mari kita buat contoh yang menggabungkan semuanya:
void main() {
try {
int age = -5;
if (age < 0) {
throw Exception("Age cannot be negative");
}
print("Age: $age");
} catch (e) {
print("Error: $e");
} finally {
print("Program selesai");
}
}
Mari kita jalankan secara mental.
Pertama:
int age = -5;
Nilai:
age = -5
Kemudian:
if (age < 0)
Apakah:
-5 < 0
Benar?
Ya.
Maka:
throw Exception("Age cannot be negative");
dijalankan.
Apa yang terjadi setelah throw?
Program langsung keluar dari alur normal try.
Jadi:
print("Age: $age");
tidak dijalankan.
Kemudian masuk ke:
catch (e)
Lalu:
print("Error: $e");
Kemudian setelah catch, masuk ke:
finally
dan:
print("Program selesai");
Jadi kira-kira:
Error: Exception: Age cannot be negative
Program selesai
20. Urutan eksekusi yang harus diingat
Untuk struktur:
try {
// A
} catch (e) {
// B
} finally {
// C
}
Jika tidak ada exception:
A
β
C
catch dilewati.
Jika ada exception:
A
β
exception
β
B
β
C
Jadi:
try β catch β finally
hanya ketika terjadi exception.
Sedangkan kalau tidak terjadi:
try β finally
21. Kesalahan yang sering dilakukan pemula
β Menganggap catch selalu dijalankan
Tidak.
try {
print("Hello");
} catch (e) {
print("Error");
}
Karena tidak ada exception, catch tidak dijalankan.
β Menganggap finally hanya dijalankan kalau error
Justru sebaliknya.
finally dijalankan baik ada error maupun tidak.
β Menganggap throw sama dengan print
Berbeda.
print("Error");
hanya mencetak teks.
Sedangkan:
throw Exception("Error");
benar-benar melempar exception.
22. Gambaran sederhana dengan kehidupan sehari-hari
Bayangkan kita menyuruh seseorang menjalankan tugas.
try
“Coba buka pintu.”
try
β
Buka pintu
Kalau berhasil:
Pintu terbuka
β
finally
Kalau gagal:
Pintu terkunci
β
catch
β
Cari solusi
β
finally
Apa pun hasilnya, kita tetap melakukan sesuatu di finally.
Jadi:
- try = coba lakukan
- catch = kalau gagal, tangani
- finally = bagaimanapun hasilnya, lakukan ini
- throw = sengaja menyatakan ada masalah
23. Ringkasan seluruh materi
| Keyword | Fungsi |
|---|---|
try | Menempatkan kode yang mungkin menghasilkan exception |
catch | Menangani exception |
finally | Selalu dijalankan setelah proses try/catch |
throw | Melempar exception secara sengaja |
Contoh paling sederhana:
try {
// kode berisiko
} catch (e) {
// jika error
} finally {
// selalu dijalankan
}
Dan membuat exception sendiri:
if (condition) {
throw Exception("Something went wrong");
}
π§ Cara paling mudah mengingat
Ingat kalimat ini:
TRY = coba, CATCH = tangkap error, FINALLY = selalu lakukan, THROW = lempar error.
Misalnya:
try {
int result = 10 ~/ 0;
} catch (e) {
print("Terjadi error: $e");
} finally {
print("Selesai");
}
Alurnya:
TRY
β
Ada exception
β
CATCH
β
Tangani exception
β
FINALLY
β
Selesai
Inilah dasar exception handling di Dart. Konsep ini nantinya sangat berguna ketika berhadapan dengan input user, parsing data, file, database, API/HTTP request, dan operasi lain yang bisa gagal saat runtime.