Hata Yönetimi (Error Handling)

Exceptions

Dart dilinde, kodunuz istisnaları (exceptions) fırlatabilir ve bunları yakalayabilir. İstisnalar, beklenmeyen bir durumu belirten hatalardır. Eğer istisna yakalanmazsa, istisnayı atan izolat (isolate) askıya alınır ve genellikle izolat ve program sonlandırılır.

Java'nın aksine, Dart'ta tüm istisnalar kontrolsüz istisnalar (unchecked exceptions) olarak kabul edilir. Yani metodlar hangi istisnaları fırlatabileceğini belirtmez ve herhangi bir istisna yakalamak zorunlu değildir.

Dart, Exception ve Error tiplerini sağlar, ayrıca birçok önceden tanımlanmış alt tipler bulunmaktadır. Elbette kendi istisna tiplerinizi de tanımlayabilirsiniz. Ancak, Dart programları Exception ve Error objeleri olmak zorunda olmayan herhangi bir non-null objeyi istisna olarak fırlatabilir.

Throw (Fırlatma)

İstisna fırlatmanın bir örneği aşağıda verilmiştir:

throw FormatException('En az 1 bölüm bekleniyordu');

Ayrıca, isteğe bağlı olarak herhangi bir objeyi de fırlatabilirsiniz:

throw 'Lamalar tükendi!';

Not

Üretim kalitesindeki kod genellikle Error veya Exception'ı uygulayan tipleri fırlatır.

Çünkü istisna fırlatmak bir ifade olduğundan dolayı, => ifadelerinde ve ifadeye izin veren diğer yerlerde istisna fırlatabilirsiniz:

void mesafeHesapla(Point diger) => throw UnimplementedError();

Catch (Yakalamak)

İstisnayı yakalamak, istisnanın yayılmasını durdurur (eğer istisnayı tekrar fırlatmazsanız). İstisnayı yakalamak, onunla ilgilenme şansı verir:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

Birden fazla türde istisna fırlatabilecek kodu ele almak için birden çok catch bloğu belirtebilirsiniz. Atılan objenin türüne eşleşen ilk catch bloğu istisnayı ele alır. Eğer catch bloğu bir tür belirtmezse, bu blok herhangi bir türde fırlatılan objeyi ele alabilir:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // Belirli bir istisna
  buyMoreLlamas();
} on Exception catch (e) {
  // Diğer tüm istisnalar
  print('Bilinmeyen istisna: $e');
} catch (e) {
  // Belirtilmemiş tür, tüm istisnaları ele alır
  print('Gerçekten bilinmeyen bir şey: $e');

Yukarıdaki kod gösterildiği gibi hem on, hem de catch veya ikisini birden kullanabilirsiniz. on, istisna türünü belirtmeniz gerektiğinde kullanılır. catch, istisna işleyicinizin istisna nesnesine ihtiyaç duyduğu durumlarda kullanılır.

catch() metoduna bir veya iki parametre belirleyebilirsiniz. İlk parametre fırlatılan istisnadır, ikinci parametre ise stack trace'i temsil eden bir StackTrace objesidir:

try {
  // ···
} on Exception catch (e) {
  print('İstisna detayları:\n $e');
} catch (e, s) {
  print('İstisna detayları:\n $e');
  print('Stack trace:\n $s');
}

Bir istisnayı kısmen ele alıp, onun yayılmasına izin vermek için rethrow anahtar kelimesini kullanabilirsiniz.

void hataYarat() {
  try {
    dynamic foo = true;
    print(foo++); // Çalışma zamanı hatası
  } catch (e) {
    print('hataYarat() kısmen ele aldı ${e.runtimeType}.');
    rethrow; // Çağrıyı yapanın istisnayı görmesine izin ver.
  }
}

void main() {
  try {
    hataYarat();
  } catch (e) {
    print('main() işlemi bitti ${e.runtimeType}.');
  }
}

Finally (En Sonunda)

Herhangi bir istisna fırlatılıp fırlatılmamasına bakılmaksızın belirli bir kodun çalışmasını sağlamak için finally bloğunu kullanabilirsiniz. Eğer hiçbir catch bloğu istisnayı eşleştirmezse, finally bloğu çalıştıktan sonra istisna yayılır:

try {
  lamaUret(); // Örnek bir fonksiyon adı, gerçek bir kodunuzla değiştirin.
} finally {
  // Her zaman temizle, eğer bir istisna fırlatılmışsa bile.
  lamaAhirlariniTemizle();
}

finally bloğu, eşleşen catch bloklarından sonra çalışır:

try {
  lamaUret(); // Örnek bir fonksiyon adı, gerçek bir kodunuzla değiştirin.
} catch (e) {
  print('Hata: $e'); // İstisnayı ilk önce ele al.
} finally {
  lamaAhirlariniTemizle(); // Sonra temizle.
}

Daha fazla bilgi için core library exception dokümantasyonuna göz atabilirsiniz.

Assert (İddia)

Geliştirme aşamasında, bir boolean koşulu false ise normal yürütmeyi bozmak için assert ifadesini kullanabilirsiniz:

// Değişkenin null olmadığından emin olun.
assert(metin != null);

// Değerin 100'den küçük olduğundan emin olun.
assert(sayi < 100);

// Bu bir https URL'si olduğundan emin olun.
assert(url.startsWith('https'));

Bir assert ifadesine bir mesaj eklemek için, assert'e ikinci argüman olarak bir dize ekleyebilirsiniz (isteğe bağlı olarak sondaki virgül ile):

assert(url.startsWith('https'),
    'URL ($url) "https" ile başlamalı.');

assert'in ilk argümanı, bir boolean değere çözülebilen herhangi bir ifade olabilir. Eğer ifadenin değeri true ise, assert başarılı olur ve yürütme devam eder. Eğer false ise, assert başarısız olur ve bir istisna (AssertionError) fırlatılır.

Assert ifadeleri ne zaman çalışır? Bu, kullandığınız araçlara ve çerçevelere bağlıdır:

  • Flutter, hata ayıklama modunda assert'leri etkinleştirir.

  • Webdev serve gibi yalnızca geliştirme araçları genellikle varsayılan olarak assert'leri etkinleştirir.

  • Bazı araçlar, dart run ve dart compile js gibi, assert'leri --enable-asserts komut satırı bayrağı ile destekler.

  • Üretim kodunda, assert'ler yok sayılır ve assert'in argümanları değerlendirilmez.

Last updated