do, try, catch
Thuộc phần Logic và luồng thực thi trong hành trình Swift của Coddy. Bài học 45 trên 56.
Cấu trúc đầy đủ để xử lý lỗi là 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 đứng trước bất kỳ lời gọi nào có thể phát sinh ngoại lệ. Nếu lời gọi phát sinh ngoại lệ, luồng điều khiển sẽ chuyển đến catch tương ứng; nếu không, chương trình tiếp tục chạy sau khối do.
Nhiều mệnh đề catch chạy lần lượt từ trên xuống dưới, và nhánh khớp đầu tiên sẽ được chọn, giống như switch. Mệnh đề catch không có đối số ở cuối sẽ bắt mọi ngoại lệ, bạn gần như luôn cần mệnh đề này để trình biên dịch không báo lỗi.
Thử thách
DễĐịnh nghĩa một enum ParseError: Error với ba trường hợp: empty, notInteger và negative.
Định nghĩa một hàm có thể ném lỗi parsePositive(_ s: String) throws -> Int với các chức năng sau:
- Ném lỗi
.emptykhissau khi loại bỏ khoảng trắng là chuỗi rỗng - Ném lỗi
.notIntegerkhi không thể phân tíchsthànhInt - Ném lỗi
.negativekhi giá trị đã phân tích là< 0 - Nếu không thì trả về giá trị đã phân tích
Đọc một dòng từ stdin và gọi parsePositive trong khối do/catch. In ra:
got: <n>khi thành côngerror: empty,error: not integerhoặcerror: negativecho từng trường hợp
Với đầu vào 42, đầu ra là got: 42. Với một dòng trống, đầu ra là error: empty. Với abc, đầu ra là error: not integer.
Tự làm thử
let line = readLine()!
// TODO: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch với ba nhánh và một nhánh catch xử lý mọi trường hợp
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