Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kaedah pengendalian pengecualian kata kunci tangguh dalam fungsi Golang

Kaedah pengendalian pengecualian kata kunci tangguh dalam fungsi Golang

WBOY
WBOYasal
2023-05-17 08:22:571658semak imbas

Golang ialah bahasa pengaturcaraan sumber terbuka yang agak baru muncul dan berprestasi tinggi Salah satu cirinya ialah kata kunci penangguhan fungsi. Kata kunci ini membolehkan kami melakukan beberapa operasi yang diperlukan sebelum tamat fungsi, seperti pembersihan sumber, output log, dll. Ia juga boleh digunakan untuk mengendalikan pengecualian, menjadikan kod kami lebih mantap dan boleh dipercayai. Artikel ini akan meneroka secara mendalam aplikasi kata kunci tangguh fungsi Golang dalam pengendalian pengecualian, supaya pembaca boleh menggunakan ciri ini dengan lebih mahir.

1. Cara menggunakan defer

Di Golang, kata kunci defer boleh digunakan untuk mentakrifkan panggilan fungsi, yang akan dilaksanakan selepas fungsi tamat. Perkara istimewa tentang penangguhan ialah ia akan dilaksanakan sebelum fungsi kembali, tidak kira sama ada pengecualian berlaku di tengah-tengah fungsi. Contohnya:

func demo() {
    defer fmt.Println("defer end.")
    fmt.Println("normal flow.")
}

Dalam kod di atas, penyataan cetakan "aliran normal akan dilaksanakan sebelum penyataan penangguhan "tunda fmt.Println("tunda tamat.")".

Selain itu, jika berbilang penyataan penangguhan digunakan dalam fungsi, susunan pelaksanaannya berada pada timbunan dan penangguhan yang ditentukan kemudian akan dilaksanakan terlebih dahulu. Contohnya:

func demo() {
    defer fmt.Println("defer 1.")
    defer fmt.Println("defer 2.")
    fmt.Println("normal flow.")
}

Dalam kod di atas, pernyataan "aliran normal dicetak dahulu, kemudian "tunda 2.", dan akhirnya "tunda 1.".

2. Tangguhkan pengendalian pengecualian

Selain penggunaan biasa, penangguhan juga boleh digunakan untuk mengendalikan pengecualian dalam kod. Pengecualian ialah ralat yang berlaku semasa program berjalan Ia mungkin disebabkan oleh banyak sebab, seperti input haram, ralat logik atau ralat sistem. Di Golang, kami boleh mengendalikan pengecualian melalui tiga kata kunci panik/tunda/pulih. Antaranya, panik akan menyebabkan pengecualian akan menangkap pengecualian dan mengendalikannya; dan menangguhkan akan melakukan beberapa operasi pembersihan yang diperlukan selepas pengecualian dikendalikan. Berikut ialah contoh praktikal untuk menggambarkan penggunaan panik/tunda/pulih:

func catchError() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recovered from: ", err)
        }
    }()
    fmt.Println("start")
    panic("error occurs!")
    fmt.Println("end")
}

Dalam kod di atas, kami memanggil fungsi catchError, mula-mula cetak pernyataan "mula", dan kemudian gunakan panik untuk menyebabkan An pengecualian dilemparkan dan "ralat berlaku!" Pada masa ini, program akan mengganggu dan memasuki penangguhan yang ditakrifkan oleh fungsi catchError. Dalam penangguhan ini, terdapat pernyataan if untuk menentukan sama ada pengecualian sedang ditangkap Jika pengecualian ditangkap, fmt.Println akan dipanggil dan "dipulihkan daripada:" dan kesilapan maklumat pengecualian akan dikeluarkan.

Contoh ini menunjukkan bahawa kata kunci panik/tunda/pulih Golang boleh digunakan untuk mengendalikan program dengan sewajarnya apabila pengecualian berlaku dalam fungsi tersebut. Memandangkan kata kunci tangguh akan dilaksanakan dalam apa jua keadaan, kami boleh menggunakan tangguh untuk melaksanakan beberapa operasi pembersihan yang diperlukan apabila pengecualian berlaku dalam program, seperti menutup fail, mengeluarkan sumber, dsb.

3. Nota mengenai penangguhan

Apabila kita menggunakan kata kunci tangguh, kita perlu memberi perhatian kepada perkara berikut:

  1. Untuk penangguhan dalam struktur gelung, pertimbangan khusus mesti dibuat Beri perhatian kepada masa pelaksanaannya.
func testLoop() {
    for i := 0; i < 5; i++ {
        defer fmt.Println("defer: ",i)
    }
    fmt.Println("test loop done.")
}

Dalam kod di atas, kami menggunakan struktur gelung untuk penangguhan ujian. Kami mahu pernyataan penangguhan dilaksanakan terlebih dahulu pada penghujung setiap gelung supaya kita boleh melepaskan sumber yang digunakan dalam gelung. Tetapi dalam kod di atas, kerana pernyataan penangguhan dilaksanakan dalam LIFO (terakhir masuk dahulu), apa yang akhirnya kami cetak ialah "gelung ujian selesai." ."Bagaimana untuk menyelesaikannya? Salah satu cara ialah menukar kod kepada:

func testLoop() {
    for i := 0; i < 5; i++ {
        defer func(i int) {
            fmt.Println("defer: ", i)
        }(i)
    }
    fmt.Println("test loop done.")
}

Cara ini menambah penutupan pada penyataan tangguh dan menghantar nilai i semasa terus ke fungsi penutupan supaya ia boleh dilaksanakan kemudian. Seperti yang anda lihat, selepas menukar kod kepada kaedah ini, kami berjaya mencetak "gelung ujian selesai dan "tunda: 4, tangguh: 3, ..., tangguh: 0."

  1. Apabila menggunakan penangguhan, kita juga mesti memberi perhatian kepada kesan prestasinya. Kerana setiap penyata penangguhan meningkatkan overhed program. Oleh itu, bilangan kali penangguhan digunakan dalam atur cara atau fungsi hendaklah dikawal dalam julat yang munasabah untuk mengelak daripada menjejaskan prestasi program.
  2. Jangan cuba ubah suai parameter dalam pernyataan tangguh kerana ia dikira apabila ia ditakrifkan. Dalam kes ini, ia mungkin membawa beberapa hasil yang tidak dijangka.
  3. Jika penyataan penangguhan kata kunci mengandungi fungsi go, goroutine akan dipanggil pada penghujung pelaksanaan fungsi dan tidak akan menjejaskan pelaksanaan fungsi utama.

4. Ringkasan

Di Golang, kata kunci tangguh ialah ciri yang sangat penting. Ia boleh digunakan untuk melaksanakan operasi pembersihan fungsi, seperti menutup fail, mengeluarkan sumber, dsb. Selain itu, apabila pengecualian berlaku dalam fungsi, pernyataan tangguh juga boleh memainkan peranan tertentu dalam menangkap dan mengendalikan pengecualian. Apabila menggunakan penangguhan, kami perlu menguasai penggunaannya dan memberi perhatian kepada langkah berjaga-jaga yang berkaitan untuk menggunakan sepenuhnya ciri ini dalam pembangunan program dan menjadikan program kami lebih mantap dan boleh dipercayai.

Atas ialah kandungan terperinci Kaedah pengendalian pengecualian kata kunci tangguh dalam fungsi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn