Menu
Coddy logo textTech

Hataları Yayma

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

Hata fırlatan bir fonksiyon, diğer hata fırlatan fonksiyonları çağırabilir. Hata, en yakın do/catch bloğuna otomatik olarak yayılır, manuel olarak yeniden fırlatılmasına gerek yoktur.

enum AuthError: Error { case badUser, badPass }

func loadUser(_ name: String) throws -> String {
    if name.isEmpty { throw AuthError.badUser }
    return name
}

func login(_ name: String, _ pass: String) throws -> String {
    let u = try loadUser(name)            // hatayı iletir
    if pass.count < 4 { throw AuthError.badPass }
    return "hello \(u)"
}

do {
    print(try login("", "abcd"))
} catch AuthError.badUser {
    print("missing user")
} catch AuthError.badPass {
    print("weak password")
}

Yukarıdan aşağıya okuyun: login, try ile loadUser fonksiyonunu çağırır. Eğer loadUser hata fırlatırsa, hata login gövdesini atlar ve dıştaki catch bloğuna düşer. Her adımı hızlıca hata verecek şekilde yazarsınız ve ne yapılacağına çağıranın karar vermesini sağlarsınız.

challenge icon

Görev

Orta

İki fırlatma (throwing) adımından oluşan küçük bir işlem hattı (pipeline) oluşturun.

İki durumu olan bir StepError: Error tanımlayın: negative, tooBig.

parseSafe(_ s: String) throws -> Int fonksiyonunu tanımlayın: Ayrıştırılan tam sayı 0'ın altındaysa .negative hatası fırlatır, aksi takdirde sayıyı döndürür. (Girdinin başarıyla ayrıştırıldığını varsayın, bu durumu başka bir yerde ele aldınız.)

capStrict(_ n: Int) throws -> Int fonksiyonunu tanımlayın: n > 100 olduğunda .tooBig hatası fırlatır, aksi takdirde n değerini döndürür.

parseSafe ve ardından capStrict fonksiyonlarını çağıran ve her türlü hatanın yayılmasına (propagate) izin veren processStep(_ s: String) throws -> Int fonksiyonunu tanımlayın.

Tek bir girdi satırı okuyun: virgülle ayrılmış bir dize listesi. Her biri için, bir do/catch bloğu içinde processStep fonksiyonunu çağırın ve şu satırlardan birini yazdırın:

  • Başarı durumunda ok: <n>
  • parseSafe hata fırlattığında negative
  • capStrict hata fırlattığında too big

10,-1,200,42 girdisi için çıktı şöyledir:

ok: 10
negative
too big
ok: 42

Kopya kağıdı

Bir hata fırlatan fonksiyon, try kullanarak diğer hata fırlatan fonksiyonları çağırabilir. Hatalar, en yakın do/catch bloğuna kadar otomatik olarak yayılır:

enum AuthError: Error { case badUser, badPass }

func loadUser(_ name: String) throws -> String {
    if name.isEmpty { throw AuthError.badUser }
    return name
}

func login(_ name: String, _ pass: String) throws -> String {
    let u = try loadUser(name)   // hata fırlatılırsa yukarı yayılır
    if pass.count < 4 { throw AuthError.badPass }
    return "hello \(u)"
}

do {
    print(try login("", "abcd"))
} catch AuthError.badUser {
    print("missing user")
} catch AuthError.badPass {
    print("weak password")
}

Eğer loadUser hata fırlatırsa, yürütme login fonksiyonunun geri kalanını atlar ve doğrudan dıştaki catch bloğuna ulaşır. Manuel olarak tekrar hata fırlatmaya gerek yoktur.

Kendin dene

let parts = readLine()!.components(separatedBy: ",")

// YAPILACAKLAR: enum StepError; parseSafe; capStrict; processStep;
// her bir parça için, processStep işlemini yapmayı/denemeyi (do/try) gerçekleştir, her bir dalı yakala (catch), yazdır
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