Xử lý lỗi là một tính năng thiết yếu của mã nguồn vững chắc. Trong phần này, bạn sẽ thêm một chút mã để trả về lỗi từ module greetings, rồi xử lý lỗi đó ở phía gọi.
Lưu ý: Chủ đề này là một phần của loạt hướng dẫn nhiều phần, bắt đầu từ Tạo một Go module.
-
Trong greetings/greetings.go, thêm đoạn mã được đánh dấu bên dưới.
Sẽ chẳng có ý nghĩa gì khi gửi lại một lời chào nếu bạn không biết phải chào ai. Hãy trả về lỗi cho phía gọi nếu tên rỗng. Chép đoạn mã sau vào greetings.go và lưu tệp lại.
package greetings import ( "errors" "fmt" ) // Hello returns a greeting for the named person. func Hello(name string) (string, error) { // If no name was given, return an error with a message. if name == "" { return "", errors.New("empty name") } // If a name was received, return a value that embeds the name // in a greeting message. message := fmt.Sprintf("Hi, %v. Welcome!", name) return message, nil }Trong đoạn mã này, bạn:
- Thay đổi hàm để nó trả về hai giá trị: một
stringvà mộterror. Phía gọi sẽ kiểm tra giá trị thứ hai để xem có lỗi xảy ra hay không. (Bất kỳ hàm Go nào cũng có thể trả về nhiều giá trị. Tìm hiểu thêm tại Effective Go.) - Import package
errorscủa thư viện chuẩn Go để bạn có thể dùng hàmerrors.New. - Thêm câu lệnh
ifđể kiểm tra yêu cầu không hợp lệ (chuỗi rỗng ở vị trí đáng lẽ phải là tên) và trả về lỗi nếu yêu cầu không hợp lệ. Hàmerrors.Newtrả về mộterrorchứa thông điệp của bạn bên trong. - Thêm
nil(nghĩa là không có lỗi) làm giá trị thứ hai trong trường hợp trả về thành công. Nhờ vậy, phía gọi biết được rằng hàm đã chạy thành công.
- Thay đổi hàm để nó trả về hai giá trị: một
-
Trong tệp hello/hello.go, hãy xử lý lỗi mà hàm
Hellogiờ đây trả về, cùng với giá trị không phải lỗi.Dán đoạn mã sau vào hello.go.
package main import ( "fmt" "log" "example.com/greetings" ) func main() { // Set properties of the predefined Logger, including // the log entry prefix and a flag to disable printing // the time, source file, and line number. log.SetPrefix("greetings: ") log.SetFlags(0) // Request a greeting message. message, err := greetings.Hello("") // If an error was returned, print it to the console and // exit the program. if err != nil { log.Fatal(err) } // If no error was returned, print the returned message // to the console. fmt.Println(message) }Trong đoạn mã này, bạn:
- Cấu hình package
logđể in tên lệnh (“greetings: “) ở đầu mỗi thông điệp log, không kèm dấu thời gian hay thông tin tệp nguồn. - Gán cả hai giá trị trả về của
Hello, bao gồm cảerror, vào biến. - Đổi đối số của
Hellotừ tên Gladys thành chuỗi rỗng, để bạn thử được phần mã xử lý lỗi. - Kiểm tra xem giá trị
errorcó khác nil không. Trong trường hợp này thì không có lý do gì để chạy tiếp. - Dùng các hàm trong package
logcủa thư viện chuẩn để xuất thông tin lỗi. Nếu gặp lỗi, bạn dùng hàmFatalcủa packagelogđể in lỗi ra và dừng chương trình.
- Cấu hình package
-
Tại dòng lệnh trong thư mục
hello, chạy hello.go để xác nhận mã hoạt động.Vì bây giờ bạn truyền vào một tên rỗng, bạn sẽ nhận được lỗi.
$ go run . greetings: empty name exit status 1
Đó là cách xử lý lỗi thông dụng trong Go: Trả về lỗi như một giá trị để phía gọi có thể kiểm tra.
Tiếp theo, bạn sẽ dùng slice trong Go để trả về một lời chào được chọn ngẫu nhiên.