SORU
3 HAZİRAN 2014, Salı


Hata İşleme Swift-Dil

Swift içine çok fazla okumadım ama benim dikkatimi çeken bir şey istisnalar vardır hayır. Nasıl hata swift taşıma yapıyorlar? Herkes hata işleme için bir şey bulundu mu?

CEVAP
4 HAZİRAN 2014, ÇARŞAMBA


Çalışma zamanı hataları:

Tour de leandros gibi anlaşılacağı için kullanma zamanı hataları (ağ bağlantı sorunları, ayrıştırma veri, dosya açma, vb.) kullanmanız gerekir NSError yaptığın gibi ObjC, çünkü Vakıf, AppKit, UİKit, vb rapor kendi hatalarını bu şekilde. Dil şey daha çerçeve şey.

Kullanılan bir başka sık desen AFNetworking gibi ayırıcı başarı/başarısızlık engeller

var sessionManager = AFHTTPSessionManager(baseURL: NSURL(string: "yavin4.yavin.planets"))
sessionManager.HEAD("/api/destoryDeathStar", parameters: xwingSquad,
    success: { (NSURLSessionDataTask) -> Void in
        println("Success")
    },
    failure:{ (NSURLSessionDataTask, NSError) -> Void in
        println("Failure")
    })

Hala hatası bloğu sık NSError örneği, hatayı açıklayan aldı.

Programcı hataları:

Programcı hataları (yasak dizi öğesi, geçersiz bağımsız bir işleve erişim arama, vb gibi) için ObjC istisnalar kullanılır. Swift dili istisnalar (*, catch, *12 vb anahtar kelime gibi) için herhangi bir dil desteği var gibi görünmüyor. Ancak belgeler ObjC olarak aynı çalışma zamanı üzerinde çalıştığı da anlaşılacağı gibi, ve bu nedenle hala bu gibi NSExceptions atmak edebiliyoruz:

NSException(name: "SomeName", reason: "SomeReason", userInfo: nil).raise()

Sen ObjC kodu istisnaları yakalamak için tercih etseler de, sadece saf olamaz Hızlı onları yakalamak.

Soruları programcı hataları için istisna atar, ya da daha doğrusu Apple dil kılavuzu da anlaşılacağı gibi iddialar kullanmanız gerekir olup olmadığıdır.

Swıft 2.0 güncelleştirin

İşler biraz daha özel durumlar için benzer bir hata işleme mekanizması, yeni bir var 2.0 ama ayrıntıda farklı Swift biraz değişti.

  1. Hata ihtimaline işaret etmektedir

Eğer işlev/yöntem bir hata atmak etmişlerdir istiyorsa, bu gibi throws anahtar kelime içermelidir

func rideTheDragon() throws { ... }

İşlevi aslında atmak ne belirtim yok, ya da herhangi bir hata atma ya da bir şey atma. not:

2=başlangıç
  • Bu işlevi çağrılırken hata atabilir

    Fonksiyonu çağırmak için deneyin anahtar kelime, böyle kullanmak gerekir

    try rideTheDragon(dragon: Dragon)
    

    bu çizgi normalde mevcut-catch bloğu, bu gibi olmalıdır

    do {
        try rideTheDragon(redDragon) 
    } catch DragonError.DragonIsMissing {
        // Error-handling
    } catch DragonError.NotEnoughMana(let manaRequired) {
        // More error-handlng
    } catch {
        // Catch all error-handling
    }
    

    Not: fıkra çok esnek geldin o zaman Hızlı desen eşleştirme tüm güçlü özelliklerini kullanmak yakalamak.

    Alternatif olarak işlevi bu gibi throws anahtar kelime ile kendini işaretlenmiştir

    func fullFillQuest(quest: Quest) throws {
        try rideTheDragon(quest.dragon)
    } 
    

    Son ama en az değil, bu hata aslında gerçekleşmeyecek biliyorum, örneğin çoktan yaptım çünkü ön koşullar, karar ve try! anahtar kelime kullanabilirsiniz.

    try! rideTheDragon(goldenDragon)
    

    Eğer bu işlev aslında hata atar, sonra uygulamanızın çalışma zamanı hatası alırsınız.

    3=başlangıç
  • Bir hata atma

    Bir hata atmak için throw bu gibi anahtar kelime kullanın

    throw DragonError.DragonIsMissing
    

    ErrorType Protokole uygun bir şey atabilir. Başlangıç olarak NSError uyan bu Protokol, ama muhtemelen gibi gitmek ile numaralama tabanlı ErrorType sağlayan grup birden çok ilgili hatalar, potansiyel olarak Ek Parçaları veriler böyle

    enum DragonError: ErrorType {
        case DragonIsMissing
        case NotEnoughMana(manaRequired: Int)
        ...
    }
    

    Swıft 2.0 hata, yeni bir mekanizma ve Java/C arasındaki temel farklar#/C tipi özel durumlar şunlardır:

    • Sözdizimi biraz farklıdır: defer do-catch try vs try-catch-finally geleneksel sözdizimi.
    • Özel durum işleme genellikle başarı yolunda daha istisna yolunda çok daha yüksek yürütme zamanı doğurur. Bu başarı yolu ve hata yolu kabaca aynı mal nerede Swıft 2.0 hataları, durum böyle değildir.
    • Tüm hata atma kodu istisnalar her yerden atılmış olsa da ilan edilmelidir. Tüm hatalar "" Java isimlendirme. özel durumlar kontrol edilir Ancak, Java aksine, potansiyel olarak atılan hataları belirtmek.
    • Swift istisnalar ObjC istisnalar ile uyumlu değildir. do-catch engelleme ObjC kullanmanız için NSException, ve vice versa herhangi yakalamak olmaz.
    • Swift istisna ile uyumlu Kakao NSError yöntem sözleşmelerin dönüş ya false (Bool döndüren fonksiyonlar) veya nil (AnyObject döndüren fonksiyonlar) ve geçen NSErrorPointer ile hata detayları.

    Syntatic-şeker gibi ekstra bir hata işleme kolaylaştırmak için, iki kavram vardır

    • sonunda Java/bloklar aynı etkiyi C#/etc ulaşmak izin ertelenen eylemler (defer anahtar kelime kullanarak)
    • normal hata/kod sinyal kontrol daha/başka kod varsa daha az yazalım nöbetçi deyimi (anahtar kelime guard kullanarak).

  • Bunu Paylaş:
    • Google+
    • E-Posta
    Etiketler:

    YORUMLAR

    SPONSOR VİDEO

    Rastgele Yazarlar

    • DrePwn

      DrePwn

      22 Temmuz 2011
    • gsipek

      gsipek

      20 Temmuz 2007
    • Metheud

      Metheud

      9 EYLÜL 2006