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.
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> parseSafehata fırlattığındanegativecapStricthata fırlattığındatoo big
10,-1,200,42 girdisi için çıktı şöyledir:
ok: 10
negative
too big
ok: 42Kopya 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
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
1Stringler Derinlemesine
Sayma ve İndekslerBüyük-Küçük Harf ve KırpmaStringlerde AramaBölme ve BirleştirmeAlt Stringleri DeğiştirmeÖzet - Kullanıcı Adı Kontrolü4Kümeler
Küme OluşturmaBirleşim ve KesişimFark ve Simetrik FarkAlt Küme ve Üst KümeÖzet - Etiket Filtresi7Proje - Alışkanlık Takibi
Projeye Genel BakışTamamlandı Olarak İşaretle10Proje - Quiz Motoru
Projeye Genel BakışSoruları Sorma2Aralıklar ve Adımlar
Kapalı ve Yarı AçıkStride (Adım)Aralık MetotlarıSwitch İçinde AralıklarÖzet - Takvim Izgarası5Yüksek Mertebeden Fonksiyonlar Bölüm 1
MapFilterReduceMap, filter, reduce zincirlemeÖzet - Kelime İstatistikleri