CodeBlanks Logo Icon CodeBlanks

Hata yönetimi

try/catch ile hata yönetimi eklersin.

Hata yönetimi

Bir listede var olmayan bir indeksi çağırırsan Dart RangeError fırlatır. Program bu hatadan dolayı çöker. Ama try/catch ile hatayı yakalayıp kullanıcıya nazik bir mesaj gösterirsin; program çalışmaya devam eder.

Örneğin iki kitaplık bir listede books[5] çağırırsan hata alırsın. try { print(books[5].title); } catch (e) { print("kitap bulunamadı"); } ile hatayı yakalar, kullanıcıya nazik mesaj verirsin. Bu, gerçek uygulamaların dayanıklı olmasını sağlar; beklenmeyen durumlar çöküş değil nazik geri dönüş olur.

try/catch deseni

Bu projede try/catch'i şu durumda kullanırız: kullanıcı bir kitap numarası ister, numara listede yoksa RangeError fırlar. catch bunu yakalar ve "kitap bulunamadı" yazar. Böylece program kitap yoksa da çalışmaya devam eder.

İyi bir uygulama, hataya dayanıklıdır. try/catch'in yanında bazen açık bir if (indeks < books.length) kontrolü de yapılır; bu, hatayı önceden önler. Hangisini seçeceğin duruma bağlıdır. try/catch daha genel; if denetimi daha açık. Bu derste try/catch'i deneyeceğiz.

Uygulama Hata yakalanan erişim

Aşağıdaki kodda Library ve Book sınıfları ile iki kitaplık bir liste zaten tanımlı. try bloğu içinde print(books[5].title) çağır; bu, liste dışı indeks hatası fırlatır. catch (e) bloğunda print("kitap bulunamadı") yazdır. Böylece program çokmek yerine mesaj verir.

Başlangıç kodu

main.dart
class Library {
  String name;
  Library(this.name);
  void info() {
    print("Kütüphane: $name");
  }
}

class Book {
  String title;
  Book(this.title);
}

void main() {
  final lib = Library("Şehir");
  lib.info();
  final b = Book("Suç ve Ceza");
  print("Yeni kitap: ${b.title}");
  final books = <Book>[Book("Suç ve Ceza"), Book("Sefiller")];
  print("Sayı: ${books.length}");
  print("İlk: ${books[0].title}");
  // try ile 5. indekse eriş; catch ile mesaj yazdır
}

Örnek çözüm

main.dart
class Library {
  String name;
  Library(this.name);
  void info() {
    print("Kütüphane: $name");
  }
}

class Book {
  String title;
  Book(this.title);
}

void main() {
  final lib = Library("Şehir");
  lib.info();
  final b = Book("Suç ve Ceza");
  print("Yeni kitap: ${b.title}");
  final books = <Book>[Book("Suç ve Ceza"), Book("Sefiller")];
  print("Sayı: ${books.length}");
  print("İlk: ${books[0].title}");
  try {
    print(books[5].title);
  } catch (e) {
    print("kitap bulunamadı");
  }
}

Beklenen çıktı

Kütüphane: Şehir
Yeni kitap: Suç ve Ceza
Sayı: 2
İlk: Suç ve Ceza
kitap bulunamadı

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hata yönetimini eşleştir

Kavram Anlamı
RangeError indeks dışı erişim
try riskli kodu taşır
catch hatayı yakalar
print mesajı yazar

2 try bloğundan çıkış ne zaman olur?

main.dart
try {
  print(books[5].title);
} catch (e) {
  print("yok");
}
  • Hata fırlatılınca
  • print çalışınca
  • main başlayınca
  • hiçbir zaman Doğru cevap

Açıklama: try içinde hata fırlatılınca catch'e geçilir.

3 catch bloğu

Soru
try {
  print(books[5].title);
} ____ (e) {
  print("kitap yok");
}
Cevap
try {
  print(books[5].title);
} catch (e) {
  print("kitap yok");
}

Açıklama: catch yazılır; ardından (e) parametresi ve blok gelir.

Başlangıç bölümündeki tüm dersler