Menu
Coddy logo textTech

do, try, catch

Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 45 / 56.

Hataları ele almanın tam biçimi do/try/catch şeklindedir:

enum DivError: Error { case byZero }

func divide(_ a: Int, _ b: Int) throws -> Int {
    if b == 0 { throw DivError.byZero }
    return a / b
}

do {
    let r = try divide(10, 2)
    print(r)                      // 5
} catch DivError.byZero {
    print("can't divide by zero")
} catch {
    print("unknown error")
}

try, hata fırlatan herhangi bir çağrının önüne gelir. Eğer çağrı hata fırlatırsa, kontrol eşleşen catch bloğuna atlar; aksi takdirde yürütme do bloğunun sonrasına devam eder.

Birden fazla catch ifadesi yukarıdan aşağıya doğru çalışır ve tıpkı bir switch gibi ilk eşleşen kazanır. Sondaki yalın catch her şeyi yakalayan kısımdır; derleyiciyi mutlu etmek için neredeyse her zaman bir tanesine ihtiyaç duyarsınız.

challenge icon

Görev

Kolay

Üç durumu olan bir ParseError: Error enum yapısı tanımlayın: empty, notInteger ve negative.

Aşağıdaki işlemleri gerçekleştiren, hata fırlatabilen (throwing) bir parsePositive(_ s: String) throws -> Int fonksiyonu tanımlayın:

  • s ifadesinin boşlukları temizlenmiş hali boş olduğunda .empty fırlatır
  • s bir Int olarak ayrıştırılamadığında .notInteger fırlatır
  • Ayrıştırılan değer < 0 olduğunda .negative fırlatır
  • Aksi takdirde ayrıştırılan değeri döndürür

stdin'den tek bir satır okuyun ve bir do/catch bloğu içinde parsePositive fonksiyonunu çağırın. Şunları yazdırın:

  • Başarı durumunda got: <n>
  • Her bir durum için error: empty, error: not integer veya error: negative

42 girişi için çıktı got: 42 olur. Boş bir satır için error: empty olur. abc için error: not integer olur.

Kopya kağıdı

Swift hata yönetimi do/try/catch yapılarını kullanır. Hataları Error protokolüne uyan bir enum ile tanımlayın, hata fırlatan fonksiyonları throws ile işaretleyin ve bir hata fırlatmak için throw kullanın:

enum DivError: Error { case byZero }

func divide(_ a: Int, _ b: Int) throws -> Int {
    if b == 0 { throw DivError.byZero }
    return a / b
}

do {
    let r = try divide(10, 2)
    print(r)                      // 5
} catch DivError.byZero {
    print("can't divide by zero")
} catch {
    print("unknown error")        // genel yakalayıcı
}
  • try her hata fırlatan çağrıdan önce gelmelidir.
  • catch ifadeleri yukarıdan aşağıya doğru eşleştirilir; ilk eşleşen kazanır.
  • Sondaki yalın bir catch, tüm hataları yakalayan bir yapı (catch-all) görevi görür.

Kendin dene

let line = readLine()!

// YAPILACAK: enum ParseError; func parsePositive(_:) throws -> Int;
// üç dal ve her şeyi kapsayan catch ile do/try/catch
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler