Menu
CoddyTech

do, try, catch

Termasuk bagian Logika dan Alur dalam perjalanan Swift di Coddy. Pelajaran 45 dari 56.

Bentuk lengkap untuk menangani error adalah do/try/catch:

enum DivError: Error { case byZero }

func divide(_ a: Int, _ b: Int) throws -> Int {
    if b == 0 { throw DivError.byZero }
    return a / b
}

do {
    let r = try divide(10, 2)
    print(r)                      // 5
} catch DivError.byZero {
    print("can't divide by zero")
} catch {
    print("unknown error")
}

try diletakkan sebelum pemanggilan apa pun yang dapat melempar error. Jika pemanggilan tersebut melempar error, kontrol beralih ke catch yang cocok. Jika tidak, eksekusi berlanjut melewati blok do.

Beberapa klausa catch dijalankan dari atas ke bawah, dan yang pertama cocok akan menang, seperti switch. catch tanpa parameter di bagian akhir adalah catch-all, kamu hampir selalu ingin menggunakannya agar compiler tidak mengeluh.

challenge icon

Tantangan

Mudah

Definisikan enum ParseError: Error dengan tiga kasus: empty, notInteger, dan negative.

Definisikan fungsi yang melempar error parsePositive(_ s: String) throws -> Int yang:

  • Melempar .empty ketika s yang sudah dihapus spasi putihnya kosong
  • Melempar .notInteger ketika s tidak bisa diuraikan sebagai Int
  • Melempar .negative ketika nilai yang diuraikan adalah < 0
  • Jika tidak, mengembalikan nilai yang diuraikan

Baca satu baris dari stdin dan panggil parsePositive dalam blok do/catch. Cetak:

  • got: <n> jika berhasil
  • error: empty, error: not integer, atau error: negative untuk setiap kasus

Untuk input 42, output-nya adalah got: 42. Untuk baris kosong, output-nya error: empty. Untuk abc, output-nya error: not integer.

Coba sendiri

let line = readLine()!

// TODO: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch dengan tiga cabang dan satu cabang catch-all
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Playground Swift