Exception adalah kejadian yang tidak diinginkan yang dapat mengganggu alur normal program. Exception handling memungkinkan kita menangani error dengan cara yang elegan.
Struktur Dasar Try-Catch
voidmain() {try {// Kode yang mungkin menghasilkan exceptionint result =12~/0; // Pembagian dengan nolprint(result); } catch (e) {print('Terjadi error: $e'); }}
Menangkap Multiple Exception
voidmain() {try {// Kode yang mungkin menghasilkan exceptionString? input =null;print(input!.length); // Null pointer exception } onFormatException {print('Format tidak valid!'); } onNoSuchMethodError {print('Method tidak ditemukan!'); } catch (e) {print('Error lain: $e'); }}
Stack Trace dalam Exception
void main() {
try {
List<int> numbers = [1, 2, 3];
print(numbers[10]); // Index out of range
} catch (e, stackTrace) {
print('Error: $e');
print('Stack trace: $stackTrace');
}
}
7.2 Finally
Penggunaan Finally
Finally block akan selalu dijalankan, baik terjadi exception atau tidak.
void main() {
var file;
try {
// Simulasi membuka file
file = openFile();
// Proses file
processFile(file);
} catch (e) {
print('Error saat memproses file: $e');
} finally {
// Selalu tutup file, terlepas dari berhasil atau error
if (file != null) {
file.close();
}
print('Pembersihan resources selesai');
}
}
Contoh Penggunaan Praktis
class DatabaseConnection {
bool isConnected = false;
void connect() {
// Simulasi koneksi database
print('Connecting to database...');
isConnected = true;
}
void disconnect() {
print('Disconnecting from database...');
isConnected = false;
}
void query(String sql) {
if (!isConnected) {
throw Exception('Database tidak terkoneksi!');
}
print('Executing query: $sql');
}
}
void main() {
var db = DatabaseConnection();
try {
db.connect();
db.query('SELECT * FROM users');
} catch (e) {
print('Database error: $e');
} finally {
db.disconnect(); // Selalu disconnect, sukses atau gagal
}
}
7.3 Custom Exception
Membuat Custom Exception
class InsufficientBalanceException implements Exception {
final double balance;
final double withdrawAmount;
InsufficientBalanceException(this.balance, this.withdrawAmount);
@override
String toString() {
return 'Saldo tidak mencukupi! Saldo: $balance, Jumlah penarikan: $withdrawAmount';
}
}
class BankAccount {
double _balance = 0;
void deposit(double amount) {
if (amount <= 0) {
throw ArgumentError('Jumlah deposit harus positif');
}
_balance += amount;
}
void withdraw(double amount) {
if (amount <= 0) {
throw ArgumentError('Jumlah penarikan harus positif');
}
if (amount > _balance) {
throw InsufficientBalanceException(_balance, amount);
}
_balance -= amount;
}
}