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.
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:
sifadesinin boşlukları temizlenmiş hali boş olduğunda.emptyfırlatırsbirIntolarak ayrıştırılamadığında.notIntegerfırlatır- Ayrıştırılan değer
< 0olduğunda.negativefı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 integerveyaerror: 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ı
}tryher hata fırlatan çağrıdan önce gelmelidir.catchifadeleri 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
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