2016-09-21 15 views
10

Swift 3'teki bir işlevi throws numaralı telefondan çağırarak, olası tüm hataları yakalamak için kapsamlı olmanız gerekir; bu da, genellikle gerçekleşmeyecek hataları işlemek için gereksiz bir ek catch {} olduğu anlamına gelir.Bir fonksiyonun Swift'de attığı türü kısıtlayabilir miyim?

throws MyErrorType söylemek mümkün mü? Bu nedenle, derleyici bu numaralandırmadaki tüm durumları ele aldığınızda gerçekten kapsamlı olduğunu biliyor olabilir mi?

+4

Hayır, sen ... –

+1

İlgili edemez: http://stackoverflow.com/questions/30740997/what-is-the-difference-between-swift-2-0-do-try-catch-and-regular-java-cc-ex. –

cevap

2

Atma hataları ile güvenli tipte basit bir yol yoktur. Derleyici, throws MyErrorType'u belirtmenize izin veriyorsa, o zaman bu işlev gövdesinde, bir do/catch bloğu dışında farklı türde bir yazı atabilecek bir işlevle try olmadığından emin olmanız gerekir. (Eh var ama gereksiz karmaşıklık katmanları ekleyecektir). Hızlı derleyici zaten yavaş olabilir ve türler çıktığında döngüler halinde sıkışabilir, Thrown türlerini çıkarıp atma işlevleri bir kâbus olabilir.

Çalışan fikir, hataların çoğu için, bunları her zaman küçük bir alt kümede ele alacağınızdır.

söyleniyor

, ekstra catch let error as MyErrorType maddelerini eklemek için gerek sadece şöyle bir catch bloğunda bir anahtarı kullanabilir, orada:

do { 
    try something() 
} catch let e { 
    switch e { 
    case let m as MyErrorType: handleMyError(m) 
    case let o as OtherErrorType: handleOther(o) 
    case is ThirdErrorType: print("error \(e)") 
    default: handleElse(e) 
    } 
}