Penanganan Error (Exception)
try/catch/on/finally, throw, Exception vs Error, membuat exception kustom, rethrow, dan praktik penanganan error yang baik.
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
| Exception | Error | |
|---|---|---|
| Artinya | Kondisi tak terduga yang bisa dipulihkan | Bug dalam kode |
| Contoh | FormatException, IOException, TimeoutException | RangeError, ArgumentError, StateError |
| Ditangani? | Ya, biasanya | Sebaiknya 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 sekitarint.parse.- Menangkap
Exceptiontetapi yang dilempar adalahError→on Exceptiontidak menangkapError. Exceptions must derive from Exception or Errorbukan syarat, tetapithrowstring tidak disarankan; lempar objek exception.