Khái niệm về lỗi
Thuộc phần Kiến thức nền tảng trong hành trình GO của Coddy. Bài học 102 trên 109.
Trong Go, errors là các giá trị cho biết đã xảy ra sự cố. Go xử lý lỗi một cách tường minh thay vì dùng ngoại lệ.
Hãy tạo một hàm (function) có thể gây ra lỗi khi chia các số:
func divide(a, b float64) (float64, error) {
if b == 0 {
return 0, errors.New("cannot divide by zero")
}
return a / b, nil
}Hàm (function) này trả về hai giá trị: kết quả phép chia và một lỗi có thể xảy ra. Nếu số chia bằng không, chúng ta trả về thông báo lỗi thay vì thực hiện phép chia.
Bây giờ, hãy dùng hàm (function) của chúng ta và xử lý mọi lỗi có thể xảy ra:
result, err := divide(10, 0)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}Sau khi chạy đoạn code này, chúng ta sẽ thấy thông báo lỗi trên màn hình vì đã thử chia cho số không:
Error: cannot divide by zeroVí dụ này minh họa cách xử lý lỗi trong Go: kiểm tra xem có lỗi xảy ra hay không (err != nil), rồi thực hiện hành động phù hợp. Nếu không có lỗi xảy ra, ta có thể an toàn sử dụng kết quả.
Thử thách
DễTrong thử thách này, bạn sẽ luyện cách xử lý lỗi trong Go. Bạn sẽ tạo một hàm chia hai số và trả về lỗi nếu phép chia cho 0 được thực hiện.
Nhiệm vụ của bạn là:
- Hoàn thiện hàm
divide, nhận hai số nguyên và trả về thương cùng một lỗi. - Nếu số chia bằng 0, hãy trả về 0 và một lỗi có thông báo "division by zero".
- Nếu phép chia hợp lệ, hãy trả về kết quả và
nilcho lỗi. - Trong hàm
main, gọidividevới các giá trị đã cho và xử lý mọi lỗi phù hợp.
Bài luyện tập này minh họa cách các hàm Go thường trả về kết quả và lỗi, cũng như cách kiểm tra và xử lý các lỗi đó.
Tự làm thử
package main
import (
"errors"
"fmt"
)
// Hàm (function) divide chia a cho b và trả về kết quả
// Nếu b bằng 0, hàm trả về lỗi
func divide(a, b int) (int, error) {
// TODO: Triển khai hàm divide
// Nếu b bằng 0, trả về 0 và lỗi có thông báo "division by zero"
// Nếu không, trả về a/b và nil cho lỗi
}
func main() {
// Test case đầu tiên
a, b := 10, 2
result, err := divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
// Test case thứ hai
a, b = 8, 0
result, err = divide(a, b)
if err != nil {
fmt.Printf("Error: %s\n", err)
} else {
fmt.Printf("Result: %d\n", result)
}
}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 Kiến thức nền tảng
4Toán tử so sánh và logic
Toán tử so sánh, phần 1Toán tử so sánh, phần 2Toán tử AND logicToán tử OR logicToán tử NOT logicCơ bản về thứ tự ưu tiên của toán tửÔn tập: thực hiện phép so sánh7Luồng điều khiển: vòng lặp
Giải thích vòng lặp `for`Vòng lặp `for` cơ bảnVòng lặp `for` chỉ có điều kiệnTừ khóa `break`Từ khóa `continue`Vòng lặp lồng nhauÔn tập: lặp lại hành động2Biến và các kiểu dữ liệu cơ bản
Biến là gìSuy luận kiểu với `:=`Số nguyên (int)Số dấu phẩy độngGiá trị BooleanChuỗiGiá trị 0Hằng sốQuy ước đặt tênÔn tập: biến và kiểu dữ liệu5Đầu vào/đầu ra cơ bản
Đầu ra có định dạngĐộng từ định dạngIn các kiểu dữ liệuNhận đầu vào cơ bản từ người dùngÔn tập: đầu vào và đầu ra8Hàm
Tìm hiểu về hàmKhai báo hàmGọi hàmTham số của hàmTrả về một giá trịTrả về nhiều giá trịGiá trị trả về có tênNhững điều cơ bản về phạm vi của hàmÔn tập: Tạo code có thể tái sử dụng11Kiểu dữ liệu phức hợp: slice
Giới thiệu về sliceKhai báo slice literalTạo slice bằng `make`Độ dài và sức chứa của sliceTruy cập phần tử trong sliceThêm phần tửTạo slice từ slice hoặc mảng hiện cóDuyệt qua sliceSao chép sliceTổng kết: danh sách động14Xử lý lỗi cơ bản
Khái niệm về lỗiGiao diện `error`Hàm trả về lỗiKiểm tra lỗiTạo lỗi đơn giảnTạo lỗi có định dạngXử lý lỗi cơ bảnÔn tập: xử lý sự cố3Toán tử cơ bản
Toán tử số họcToán tử chiaToán tử moduloToán tử gánToán tử gán kết hợpTăng và giảmÔn tập: Tính toán6Luồng điều khiển: câu lệnh điều kiện
Câu lệnh `if`Từ khóa `else`Từ khóa `else if`Biến bị che khuất trong `if`Khởi tạo biếnCâu lệnh `switch``switch` có biểu thức`switch` không có biểu thứcTừ khóa `fallthrough`Ôn tập: đưa ra quyết địnhTự luyện tập: Trình biên dịch Go online