Menu
CoddyTech

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 zero

Ví 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ả.

challenge icon

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à:

  1. Hoàn thiện hàm divide, nhận hai số nguyên và trả về thương cùng một lỗi.
  2. 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".
  3. Nếu phép chia hợp lệ, hãy trả về kết quả và nil cho lỗi.
  4. Trong hàm main, gọi divide vớ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)
    }
}
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 Kiến thức nền tảng

Tự luyện tập: Trình biên dịch Go online