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.
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
.negativekhin < 0 - Ném
.tooBigkhin > 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 { ... } ...
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
1Chuỗi chuyên sâu
Đếm và chỉ sốChữ hoa, chữ thường và xóa khoảng trắngTìm kiếm trong chuỗiTách và nối chuỗiThay thế chuỗi conÔn tập: Kiểm tra tên người dùng4Tập hợp
Tạo tập hợpPhép hợp và phép giaoPhép trừ và hiệu đối xứngTập con và tập hợp conÔn tập: Bộ lọc thẻ7Dự án: Theo dõi thói quen
Tổng quan dự ánĐánh dấu hoàn thành10Dự án: bộ máy trắc nghiệm
Tổng quan dự ánĐặt câu hỏiTự luyện tập: Playground Swift