Sobes.tech
Junior

Swift'te hataları nasıl yakalarsınız?

sobes.tech yapay zeka

AI'dan gelen yanıt

Swift'te hatalar, throw, throws, try anahtar kelimeleri ve do-catch bloğu kullanılarak yapılan hata işleme sistemiyle yakalanır.

  1. Hata atabilecek fonksiyonların bildirimi: Fonksiyon parametrelerinden sonra throws anahtar kelimesi kullanılır.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Hata atılır
        }
        // ...veri işleme mantığı...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "İşlenmiş: \(input)"
    }
    
  2. Hata atabilecek fonksiyonları çağırma: try anahtar kelimesi kullanılır.

    do { // Hata işleme bloğu
        let result = try processData(input: "geçerli veri")
        print(result) // "İşlenmiş: geçerli veri"
    } catch { // Hataları yakalama bloğu
        print("Bir hata oluştu: \(error)")
    }
    
  3. Belirli hata türlerini yakalama: catch bloğunda belirli hata türleri belirtilebilir.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Veri boş, lütfen giriş yapın.")
    } catch DataError.invalidFormat {
        print("Veri formatı geçersiz.")
    } catch { // Diğer tüm hataları yakala
        print("Beklenmedik bir hata oluştu: \(error)")
    }
    
  4. defer bloğu: Bu blok, mevcut kapsamdan çıkmadan hemen önce çalıştırılır, hata olup olmamasına bakılmaksızın. Kaynakları temizlemek için sıkça kullanılır.

    func openFile(_ filename: String) throws -> String {
        // Diyelim ki bu, bir dosyayı açar ve içeriğini döner
        print("Dosya \(filename) açılıyor")
        // ... açma mantığı...
    
        defer {
            // Bu kod, fonksiyondan çıkmadan önce çalışır,
            // hata olsa bile
            print("Dosya \(filename) kapatılıyor")
        }
    
        // ... dosya işlemleri ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Hata atılır
        }
    
        return "Dosya içeriği"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Dosya işleme hatası: \(error)")
    }
    
  5. try? opsiyonel: Bu, opsiyonel bir değer döndürür. Eğer fonksiyon hata atarsa, try? nil döner.

    let processedResult = try? processData(input: "") // processedResult nil olacak
    let validResult = try? processData(input: "abc") // validResult, "Processed: abc" değerine sahip opsiyonel String olacak
    
  6. Zorunlu try!: Bu, hatanın olmayacağından emin olduğunuz durumlarda kullanılır. Hata olursa, uygulama çökerek sona erer. Dikkatli kullanın.

    // Sadece fonksiyonun hata vermeyeceğinden %100 eminseniz kullanın
    let result = try! processData(input: "her zaman geçerli giriş")
    

do-catch tabanlı sistem, diğer dillerdeki geleneksel istisnalara kıyasla daha açık ve güvenli bir hata işleme yöntemidir, çünkü hata atabilecek fonksiyonların (throws) açıkça bildirilmesini ve bu hataların çağrılırken (try, do-catch) açıkça ele alınmasını gerektirir.