Exception adalah masalah atau kesalahan yang muncul saat menjalankan program. Ketika sebuah exception terjadi, flow normal dari program terganggu dan program dihentikan secara tidak normal.
Beberapa exception bawaan dalam Dart termasuk :
No | Exception & Deskripsi |
---|---|
1 | DeferredLoadException Kesalahan saat suatu library gagal dimuat. |
2 | FormatException Kesalahan ketika sebuah String atau data lain tidak memiliki tipe atau format yang diharapkan dan tidak dapat diproses. |
3 | IntegerDivisionByZeroException Kesalahan ketika angka dibagi dengan nol. |
4 | IOException Kesalahan yang terjadi terkait proses input dan output, seperti membaca file, mencetak ke console dan sejenisnya. |
5 | IsolateSpawnException Kesalahan ketika sebuah isolat tidak dapat dibuat. |
6 | Timeout Kesalahan saat scheduled timeout terjadi sambil menunggu hasil operasi async. |
Setiap exception dalam Dart adalah sub class dari class Exception. Exception harus ditangani untuk mencegah aplikasi berhenti secara tiba-tiba.
Blok try / on / catch
Blok try berisi perintah atau pernyataan dalam bentuk baris kode yang mungkin mengakibatkan kesalahan dan menghasilkan exception. Blok on digunakan ketika suatu jenis exception tertentu perlu ditangani untuk baris kode tertentu. Blok catch digunakan untuk meletakkan baris kode yang menangani exception secara lebih general.
Blok try harus diikuti oleh satu blok on/catch atau satu blok finally (atau keduanya). Ketika exception terjadi di blok try, kontrol akan dialihkan ke blok catch.
Cara penulisan untuk menangani exception adalah seperti yang diberikan di bawah ini :
try {
// kode yang mungkin melempar exception
}
on Exception1 {
// kode untuk menangani exception tertentu yaitu Exception1
}
catch Exception2 {
// kode untuk menangani Exception2
}
Berikut adalah beberapa poin yang perlu diingat:
- Baris kode bisa memiliki lebih dari satu blok on / catch untuk menangani beberapa exception.
- Blok on dan catch saling inklusif, yaitu blok try dapat dihubungkan dengan kedua blok on dan catch.
Kode berikut menggambarkan penanganan exception di Dart.
Contoh: Menggunakan Blok on
Program berikut membagi dua angka yang direpresentasikan oleh variabel x dan y. Program akan menghasilkan exception karena mencoba membagi dengan nol. Blok on berisi kode untuk menangani exception ini.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on Exception {
print('Tidak bisa dibagi dengan nol');
}
}
Kode di atas akan menghasilkan output berikut :
Tidak bisa dibagi dengan nol
Contoh : Menggunakan Blok catch
Pada contoh di bawah ini, kita menggunakan kode yang sama seperti sebelumnya. Satu-satunya perbedaan adalah menggunakan blok catch (daripada blok on) untuk menangani exception. Parameter catch berisi Object Exception yang dihasilkan saat runtime.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
Kode di atas akan mengembalikan output berikut :
IntegerDivisionByZeroException
Contoh: on…catch
Contoh berikut menunjukkan bagaimana menggunakan blok on…catch.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
Kode di atas akan mengembalikan output berikut :
IntegerDivisionByZeroException
Blok Finally
Blok finally berisi baris kode, perintah dan pernyataan yang harus dieksekusi setelah exception terjadi. Blok finally tidak wajib ada, dan kalau ada maka akan pasti dieksekusi tanpa syarat setelah blok try/on/catch.
Cara penulisan untuk menggunakan blok finally adalah sebagai berikut :
try {
// kode yang mungkin melempar pengecualian
}
on Exception1 {
// kode untuk menangani Exception1
}
catch Exception2 {
// kode untuk menangani Exception2
}
finally {
// kode yang harus selalu dijalankan
}
Contoh berikut ini menjelaskan penggunaan blok finally.
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on Exception {
print('Tidak bisa dibagi dengan nol');
}
finally {
print('Block finally dieksekusi');
}
}
Kode di atas akan mengeluarkan output berikut :
Tidak bisa dibagi dengan nol
Block finally dieksekusi
Melempar Sebuah Exception
Kata kunci throw digunakan untuk secara eksplisit memunculkan exception. Exception yang muncul harus ditangani untuk mencegah program keluar secara tiba-tiba.
Cara penulisan untuk mengeluarkan exception secara eksplisit adalah :
throw new namaException()
Contoh
Contoh berikut menunjukkan bagaimana menggunakan kata kunci throw untuk melempar exception :
main() {
try {
test_umur(-2);
}
catch(e) {
print('Umur tidak bisa negatif');
}
}
void test_umur(int umur) {
if(umur<0) {
throw new FormatException();
}
}
Kode di atas akan menghasilkan output berikut:
Umur tidak bisa negatif
Custom Exception
Seperti yang sudah dijelaskan sebelumnya, setiap jenis exception di Dart merupakan sub class dari kelas bawaan Exception. Dart memungkinkan pembuatan exception khusus dengan cara mengekstensi exception yang sudah ada. Berikut adalah cara penulisan untuk mendefinisikan exception khusus:
Cara Penulisan Custom Exception
class namaExceptionKhusus implements Exception {
// bisa berisi constructor, variable dan method
}
Custom exception harus dilempar secara eksplisit dan harus ditangani di dalam kode.
Contoh
Contoh berikut ini menunjukkan cara mendefinisikan dan menangani custom exception.
class AmtException implements Exception {
String errMsg() => 'Jumlah harus lebih besar dari nol';
}
void main() {
try {
withdraw_amt(-1);
}
catch(e) {
print(e);
}
finally {
print('Mengakhiri operasi yang diminta.....');
}
}
void withdraw_amt(int amt) {
if (amt <= 0) {
throw new AmtException().errMsg();
}
}
Pada kode di atas, kita sedang mendefinisikan sebuah exception khusus bernama AmtException. Kode ini akan memunculkan exception jika jumlah yang diberikan tidak berada dalam rentang yang diharapkan. Fungsi utama (main function) melakukan pemanggilan fungsi di dalam blok try…catch.
Kode ini seharusnya menghasilkan keluaran sebagai berikut :
Jumlah harus lebih besar dari nol
Mengakhiri operasi yang diminta.....
Tutorial sebelumnya : Dart Package
Tutorial setelahnya : Debugging Pada Dart
Semua Tutorial Dart : Tutorial Dart