throws
Swift ile bildirilen bir işlevi çağırırken , işlev çağrısı sitesine try
veya ile açıklama eklemeniz gerekir try!
. Örneğin, fırlatma fonksiyonu verildiğinde:
func willOnlyThrowIfTrue(value: Bool) throws {
if value { throw someError }
}
bu fonksiyon şöyle adlandırılabilir:
func foo(value: Bool) throws {
try willOnlyThrowIfTrue(value)
}
Burada try
okuyucuya bu işlevin bir istisna atabileceğini ve aşağıdaki kod satırlarının yürütülemeyeceğini söyleyen çağrıyı ekleriz. Ayrıca bu işleve ek açıklama eklememiz gerekir throws
, çünkü bu işlev bir istisna fırlatabilir (yani willOnlyThrowIfTrue()
fırlattığında, foo
istisnayı otomatik olarak yukarı doğru yeniden sarar.
Büyük olasılıkla fırlatma olarak bildirilen ancak doğru girdiyi verdiğiniz için davanıza atmayacağını bildiğiniz bir işlevi çağırmak istiyorsanız, kullanabilirsiniz try!
.
func bar() {
try! willOnlyThrowIfTrue(false)
}
Bu şekilde, kodun atılmayacağını garanti ettiğinizde, istisna yayılımını devre dışı bırakmak için ekstra kaynak kodu koymak zorunda kalmazsınız.
try!
çalışma zamanında uygulanır: kullanırsanız try!
ve işlev atılırsa, programınızın yürütülmesi bir çalışma zamanı hatasıyla sonlandırılır.
Çoğu istisna işleme kodu yukarıdaki gibi görünmelidir: ya istisnaları ortaya çıktıklarında yukarı doğru yayarsınız, aksi takdirde olası istisnalar hariç tutulacak koşulları ayarlarsınız. Kodunuzdaki diğer kaynakların temizlenmesi nesne imhası (örn. deinit()
) Veya bazen defer
ed kodu aracılığıyla gerçekleşmelidir .
func baz(value: Bool) throws {
var filePath = NSBundle.mainBundle().pathForResource("theFile", ofType:"txt")
var data = NSData(contentsOfFile:filePath)
try willOnlyThrowIfTrue(value)
// data and filePath automatically cleaned up, even when an exception occurs.
}
Herhangi bir nedenden dolayı çalıştırılması gereken, ancak bir deinit()
işlevde olmayan bir kodunuz varsa, kullanabilirsiniz defer
.
func qux(value: Bool) throws {
defer {
print("this code runs when the function exits, even when it exits by an exception")
}
try willOnlyThrowIfTrue(value)
}
İstisnalarla ilgilenen kodların çoğu, arayanlara yukarı doğru yayılmasını deinit()
veya yol üzerinden temizlik yapmasını sağlar defer
. Çünkü çoğu kod hatalarla ne yapılacağını bilmez; neyin yanlış gittiğini biliyor, ancak hata hakkında ne yapacağını bilmek için bazı üst düzey kodların ne yapmaya çalıştığı hakkında yeterli bilgiye sahip değil. Bir iletişim kutusunun kullanıcıya sunulmasının uygun olup olmadığını veya yeniden denenmesi gerekip gerekmediğini veya başka bir şeyin uygun olup olmadığını bilmez.
Bununla birlikte, daha yüksek seviye kodu, herhangi bir hata durumunda tam olarak ne yapacağını bilmelidir. Bu nedenle istisnalar, belirli hataların başlangıçta meydana geldikleri yerden, ele alınabilecekleri yere kadar kabarmasını sağlar.
İstisnaların ele alınması catch
ifadeler aracılığıyla yapılır .
func quux(value: Bool) {
do {
try willOnlyThrowIfTrue(value)
} catch {
// handle error
}
}
Her biri farklı türde bir istisna yakalayan birden çok catch deyimine sahip olabilirsiniz.
do {
try someFunctionThatThowsDifferentExceptions()
} catch MyErrorType.errorA {
// handle errorA
} catch MyErrorType.errorB {
// handle errorB
} catch {
// handle other errors
}
İstisnalar içeren en iyi uygulamalar hakkında daha fazla bilgi için bkz. Http://exceptionsafecode.com/ . Özellikle C ++ 'ı hedefliyor, ancak Swift istisna modelini inceledikten sonra temel bilgilerin Swift için de geçerli olduğuna inanıyorum.
Swift sözdizimi ve hata işleme modeli hakkında ayrıntılar için, Swift Programlama Dili (Swift 2 Ön Yayın) kitabına bakın .