Swift 2 hata işleme modelinin iki önemli noktası vardır: kapsamlılık ve esneklik. Birlikte, sadece atabileceğinizi bildiğinizleri değil, olası her hatayı yakalamanız gereken do
/ catch
ifadenize kaybolurlar.
Bir işlevin ne tür hatalar atabileceğini, yalnızca atıp atmadığını bildirmediğinize dikkat edin. Bu sıfır bir sonsuzluk problemidir: başkalarının (gelecekteki benliğiniz dahil) kullanması için bir işlev tanımlayan biri olarak, işlevinizin her istemcisinin, uygulamanızdaki her değişikliğe adapte olmasını istemezsiniz. hangi hatalar atabileceğini de içerir. İşlevinizi çağıran kodun bu değişikliğe dayanıklı olmasını istiyorsunuz.
İşleviniz ne tür hatalar attığını (veya gelecekte atabileceğini) söyleyemediğinden, hataları catch
yakalayan bloklar ne tür hatalar atabileceğini bilemez. Bu nedenle, bildiğiniz hata türlerini ele catch
almanın yanı sıra, evrensel bir ifadeyle yapmadığınız durumları da ele almanız gerekir - bu şekilde işleviniz gelecekte atacağı hata kümesini değiştirirse, arayanlar yine de hatalar.
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch SandwichError.NotMe {
print("Not me error")
} catch SandwichError.DoItYourself {
print("do it error")
} catch let error {
print(error.localizedDescription)
}
Ama burada durmayalım. Bu esneklik fikrini biraz daha düşünün. Sandviçinizi tasarladığınız şekilde, hataları kullandığınız her yerde tanımlamanız gerekir. Bu, hata durumları kümesini her değiştirdiğinizde, bunları kullanan her yeri değiştirmek zorunda olduğunuz anlamına gelir ... çok eğlenceli değil.
Kendi hata türlerinizi tanımlamanın ardındaki fikir, bunun gibi şeyleri merkezileştirmenize izin vermektir. description
Hatalarınız için bir yöntem tanımlayabilirsiniz :
extension SandwichError: CustomStringConvertible {
var description: String {
switch self {
case NotMe: return "Not me error"
case DoItYourself: return "Try sudo"
}
}
}
Ve sonra hata işleme kodunuz hata türünüzün kendisini tanımlamasını isteyebilir - şimdi hataları ele aldığınız her yer aynı kodu kullanabilir ve gelecekteki olası hata durumlarını da işleyebilir.
do {
let sandwich = try makeMeSandwich(kitchen)
print("i eat it \(sandwich)")
} catch let error as SandwichError {
print(error.description)
} catch {
print("i dunno")
}
Bu ayrıca hata türlerinin (veya üzerlerindeki uzantıların) hataları bildirmenin diğer yollarını desteklemesinin yolunu açar - örneğin, UIAlertController
hata türünüzde hatayı bir iOS kullanıcısına bildirmek için nasıl sunulacağını bilen bir uzantıya sahip olabilirsiniz .