Bahasa Go tidak menyokong mekanisme pengendalian pengecualian dalam erti kata tradisional, tetapi dalam bahasa Go, terdapat beberapa kaedah pengendalian ralat yang boleh digunakan untuk mengendalikan jenis ralat yang berbeza. Dalam artikel ini, kami akan memperkenalkan kaedah pengendalian pengecualian dalam bahasa Go.
Dalam bahasa Go, jika nilai yang dikembalikan oleh fungsi ialah nilai jenis ralat, ini bermakna fungsi itu mungkin mempunyai beberapa jenis ralat. Apabila fungsi ini dipanggil, nilai ralat yang dikembalikan diperiksa untuk menentukan bagaimana program harus meneruskan pelaksanaan. Kaedah ini agak langsung dan mudah, dan merupakan kaedah pengendalian ralat utama dalam bahasa Go.
Contohnya:
func Divide(a, b int) (int, error) { if b == 0 { return 0, fmt.Errorf("can't divide by zero") } return a / b, nil }
Seperti yang anda lihat, jika pembahagi ialah 0, fungsi akan mengembalikan nilai ralat. Apabila fungsi ini dipanggil, nilai pulangan diperiksa untuk melihat sama ada ralat telah berlaku Jika nilai ralat tidak sifar, atur cara melaksanakan kod pengendalian ralat yang sepadan.
result, err := Divide(5, 0) if err != nil { log.Fatal(err) }
Walaupun bahasa Go tidak mempunyai mekanisme pengendalian pengecualian dalam pengertian tradisional, ia menyediakan gabungan fungsi tangguh, panik dan pulih . Gabungan ini dipanggil mekanisme "tunda-panik-pemulihan".
Contohnya:
func Foo() { defer func() { if r := recover(); r != nil { log.Println("Recovered:", r) } }() panic("I'm panic!") fmt.Println("Continuing execution...") }
Seperti yang anda lihat, panggilan fungsi panik ialah cara untuk menamatkan pelaksanaan program. Jika terdapat berbilang fungsi penangguhan, ia akan dilaksanakan dalam susunan FILO, jadi fungsi pulih harus diletakkan dalam fungsi penangguhan paling luar.
Bahasa Go juga menyediakan cara untuk menyesuaikan jenis ralat. Apabila pengendalian ralat khusus yang lebih terperinci diperlukan, jenis ralat boleh disesuaikan.
Contoh:
type DivideError struct { dividend int divisor int } func (de DivideError) Error() string { return fmt.Sprintf("can't divide %d by %d", de.dividend, de.divisor) } func Divide(a, b int) (int, error) { if b == 0 { return 0, DivideError{a, b} } return a / b, nil }
Dalam contoh ini, kami mentakrifkan jenis ralat baharu DivideError . Jenis ini mengandungi pembahagi dan dividen. Jenis ini juga melaksanakan kaedah Ralat untuk mengembalikan mesej ralat. Dalam fungsi Divide kami, jika pembahagi ialah 0, jenis DivideError yang dimulakan dikembalikan.
result, err := Divide(5, 0) if de, ok := err.(DivideError); ok { log.Fatalf("Error handled by application: %s ", de.Error()) } else if err != nil { log.Fatal(err) }
Perlu diambil perhatian bahawa apabila menggunakan jenis tersuai sebagai ralat, anda perlu menggunakan penegasan jenis untuk penukaran jenis untuk mengendalikan jenis ralat tertentu.
Dalam artikel ini, kami memperkenalkan kaedah pengendalian pengecualian dalam bahasa Go, iaitu nilai pulangan ralat, mekanisme pemulihan-panik dan jenis ralat tersuai. Sudah tentu, dalam pembangunan sebenar, kaedah pengendalian pengecualian yang paling sesuai perlu dipilih mengikut situasi tertentu.
Atas ialah kandungan terperinci Apakah kaedah pengendalian pengecualian dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!