Menu
CoddyTech

throws và Error

Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 44 trên 56.

Swift xử lý lỗi bằng cách yêu cầu hàm khai báo rằng chúng có thể thất bại. Phần thân hàm ném ra một giá trị lỗi; nơi gọi hàm phải xử lý lỗi đó.

Kiểu lỗi là bất kỳ kiểu nào tuân theo giao thức tích hợp sẵn Error. Cách đơn giản nhất để khai báo kiểu riêng là dùng enum:

enum InputError: Error {
    case empty
    case tooLong
}

Hàm có thể ném ngoại lệ dùng từ khóa throws trong chữ ký hàm và câu lệnh throw trong phần thân:

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

Bạn không thể gọi trực tiếp một hàm có thể phát sinh ngoại lệ, trình biên dịch buộc bạn phải xử lý lỗi. Bài học tiếp theo sẽ hướng dẫn cách thực hiện.

challenge icon

Thử thách

Dễ

Định nghĩa một enum NumError: Error với hai trường hợp: negative và tooBig.

Định nghĩa một hàm có thể ném ngoại lệ doubleSafely(_ n: Int) throws -> Int với cách hoạt động như sau:

  • Ném .negative khi n < 0
  • Ném .tooBig khi n > 100
  • Nếu không, trả về n * 2

Đọc một số nguyên từ stdin. Gọi doubleSafely bên trong khối do/catch (bạn sẽ học dạng chính xác ở bài học tiếp theo; hiện tại hãy dùng đúng khung này):

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

Với đầu vào 10, đầu ra là ok: 20. Với -1, đầu ra là negative. Với 500, đầu ra là too big.

Tự làm thử

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 iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng thực thi

Tự luyện tập: Playground Swift