throws ve Error
Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 44 / 56.
Swift, fonksiyonların hata verebileceğini bildirmesini sağlayarak hataları yönetir. Fonksiyon gövdesi bir hata değeri fırlatır; çağıranın bunu ele alması gerekir.
Bir hata türü, yerleşik Error protokolüne uyan herhangi bir şeydir. Kendi hata türünüzü tanımlamanın en basit yolu bir enum kullanmaktır:
enum InputError: Error {
case empty
case tooLong
}Hata fırlatan bir fonksiyon, imzasında throws anahtar kelimesini ve gövdesinde throw ifadesini kullanır:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Hata fırlatan bir fonksiyonu (throwing function) doğrudan çağıramazsınız, derleyici sizi hatayı ele almaya zorlar. Bir sonraki ders bunun nasıl yapılacağını anlatıyor.
Görev
Kolayİki durumu olan bir NumError: Error enum yapısı tanımlayın: negative ve tooBig.
Aşağıdaki işlemleri yapan, hata fırlatabilen bir doubleSafely(_ n: Int) throws -> Int fonksiyonu tanımlayın:
n < 0olduğunda.negativefırlatırn > 100olduğunda.tooBigfırlatır- Aksi takdirde
n * 2değerini döndürür
Stdin'den tek bir tam sayı okuyun. Bir do/catch bloğu içinde doubleSafely fonksiyonunu çağırın (tam yapıyı bir sonraki derste öğreneceksiniz; şimdilik tam olarak bu iskeleti kullanın):
do {
let result = try doubleSafely(n)
print("ok: \(result)")
} catch NumError.negative {
print("negative")
} catch NumError.tooBig {
print("too big")
} catch {
print("unknown")
}10 girdisi için çıktı ok: 20 olur. -1 için negative olur. 500 için too big olur.
Kopya kağıdı
Error protokolüne uygun bir enum kullanarak hata türlerini tanımlayın:
enum InputError: Error {
case empty
case tooLong
}Bir fonksiyonu throws ile hata fırlatabilir olarak işaretleyin ve bir hata oluşturmak için throw kullanın:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Hata fırlatan fonksiyonlar hata yönetimi (örneğin do/catch) ile çağrılmalıdır; derleyici bunu zorunlu kılar.
Kendin dene
let n = Int(readLine()!)!
// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
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