Menu
Coddy logo textTech

throws ve Error

Coddy'nin Swift Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 44 / 56.

Swift, fonksiyonların hata verebileceğini bildirmesini sağlayarak hataları yönetir. Fonksiyon gövdesi bir hata değeri fırlatır; çağıranın bunu ele alması gerekir.

Bir hata türü, yerleşik Error protokolüne uyan herhangi bir şeydir. Kendi hata türünüzü tanımlamanın en basit yolu bir enum kullanmaktır:

enum InputError: Error {
    case empty
    case tooLong
}

Hata fırlatan bir fonksiyon, imzasında throws anahtar kelimesini ve gövdesinde throw ifadesini kullanır:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

Hata fırlatan bir fonksiyonu (throwing function) doğrudan çağıramazsınız, derleyici sizi hatayı ele almaya zorlar. Bir sonraki ders bunun nasıl yapılacağını anlatıyor.

challenge icon

Görev

Kolay

İki durumu olan bir NumError: Error enum yapısı tanımlayın: negative ve tooBig.

Aşağıdaki işlemleri yapan, hata fırlatabilen bir doubleSafely(_ n: Int) throws -> Int fonksiyonu tanımlayın:

  • n < 0 olduğunda .negative fırlatır
  • n > 100 olduğunda .tooBig fırlatır
  • Aksi takdirde n * 2 değerini döndürür

Stdin'den tek bir tam sayı okuyun. Bir do/catch bloğu içinde doubleSafely fonksiyonunu çağırın (tam yapıyı bir sonraki derste öğreneceksiniz; şimdilik tam olarak bu iskeleti kullanın):

do {
    let result = try doubleSafely(n)
    print("ok: \(result)")
} catch NumError.negative {
    print("negative")
} catch NumError.tooBig {
    print("too big")
} catch {
    print("unknown")
}

10 girdisi için çıktı ok: 20 olur. -1 için negative olur. 500 için too big olur.

Kopya kağıdı

Error protokolüne uygun bir enum kullanarak hata türlerini tanımlayın:

enum InputError: Error {
    case empty
    case tooLong
}

Bir fonksiyonu throws ile hata fırlatabilir olarak işaretleyin ve bir hata oluşturmak için throw kullanın:

func validate(_ s: String) throws -> String {
    if s.isEmpty { throw InputError.empty }
    if s.count > 100 { throw InputError.tooLong }
    return s
}

Hata fırlatan fonksiyonlar hata yönetimi (örneğin do/catch) ile çağrılmalıdır; derleyici bunu zorunlu kılar.

Kendin dene

let n = Int(readLine()!)!

// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler