Rumah pembangunan bahagian belakang Golang Cara menggunakan Go dan konteks secara elegan untuk pengendalian ralat

Cara menggunakan Go dan konteks secara elegan untuk pengendalian ralat

Jul 21, 2023 pm 11:37 PM
go Ralat pengendalian rahmat context

Cara menggunakan Go dan konteks secara elegan untuk pengendalian ralat

Dalam pengaturcaraan Go, pengendalian ralat ialah tugas yang sangat penting. Mengendalikan ralat dengan anggun meningkatkan kebolehbacaan kod, kebolehselenggaraan dan kestabilan. Pakej konteks bahasa Go memberikan kami cara yang sangat mudah untuk mengendalikan operasi berkaitan ralat. Artikel ini akan memperkenalkan cara menggunakan Go dan konteks secara elegan untuk pengendalian ralat dan memberikan contoh kod yang berkaitan.

  1. Pengenalan

Mekanisme pengendalian ralat bahasa Go dilaksanakan dengan mengembalikan nilai ralat. Dalam keadaan biasa, kami akan mengembalikan nilai jenis ralat dalam nilai pulangan fungsi untuk menunjukkan sama ada fungsi tersebut telah berjaya dilaksanakan. Tetapi dalam pembangunan sebenar, selalunya terdapat lebih daripada satu ralat, tetapi pelbagai peringkat ralat. Pada ketika ini, hanya menghantar semua nilai ralat ke rantai panggilan atas akan menjadikan kod itu rumit dan sukar dibaca. Pakej konteks bahasa Go boleh membantu kami mengurus dan menyebarkan ralat ini dengan lebih baik.

  1. Menggunakan pakej konteks

Pakej konteks menyediakan jenis Konteks untuk mengurus semua data yang berkaitan dengan permintaan. Ia boleh digunakan untuk menjejaki kitaran hayat permintaan dan lulus ralat jika perlu. Berikut ialah contoh kod menggunakan pakej konteks untuk pengendalian ralat:

package main

import (
    "context"
    "errors"
    "fmt"
)

func main() {
    ctx := context.Background() // 创建一个根Context

    // 创建一个新的Context,并添加一些与请求相关的数据
    ctx = context.WithValue(ctx, "userID", 1001)
    ctx = context.WithValue(ctx, "isAdmin", true)

    // 调用一个模拟的业务函数,并传入Context
    err := businessFunc(ctx)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Success")
    }
}

func businessFunc(ctx context.Context) error {
    userID := ctx.Value("userID").(int)
    isAdmin := ctx.Value("isAdmin").(bool)

    if isAdmin {
        return nil
    } else {
        return errors.New("Permission denied")
    }
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta Konteks akar dan kemudian menggunakan kaedah WithValue untuk menambah beberapa data berkaitan permintaan pada Konteks, seperti userID dan isAdmin. Seterusnya, kami memanggil fungsi perniagaan yang dipanggil businessFunc dan memberikannya Konteks sebagai parameter.

Dalam pelaksanaan fungsi perniagaan, kami memperoleh data permintaan melalui kaedah ctx.Value, dan menggunakan data ini untuk menentukan sama ada kami mempunyai kebenaran untuk melaksanakan operasi tertentu. Jika tiada kebenaran, ralat dikembalikan.

Kelebihan menggunakan pakej konteks ialah kita boleh menghantar maklumat konteks permintaan kepada semua fungsi berkaitan tanpa menambah beberapa parameter tambahan pada setiap fungsi. Apabila ralat berlaku, kita boleh mendapatkan dan mengendalikannya dengan mudah dari mana-mana fungsi.

  1. Ralat penyebaran dan pengendalian tamat masa

Selain kaedah WithValue dalam contoh di atas, pakej konteks juga menyediakan beberapa kaedah lain untuk menyebarkan dan mengendalikan ralat. Kaedah yang paling biasa digunakan ialah WithCancel dan WithTimeout.

WithCancel digunakan untuk mencipta Konteks yang boleh dibatalkan. Kami boleh menggunakannya apabila kami ingin membatalkan beberapa operasi apabila syarat tertentu dipenuhi, atau membatalkan operasi apabila tiada respons diterima dalam tempoh masa. Berikut ialah kod sampel yang menggunakan WithCancel untuk tamat masa fungsi perniagaan:

package main

import (
    "context"
    "errors"
    "fmt"
    "time"
)

func main() {
    ctx := context.Background()

    ctx, cancel := context.WithCancel(ctx)
    go func() {
        time.Sleep(2 * time.Second)
        cancel() // 2秒后取消操作
    }()

    err := businessFunc(ctx)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Success")
    }
}

func businessFunc(ctx context.Context) error {
    select {
    case <-ctx.Done():
        return errors.New("Timeout")
    default:
        // 执行一些操作
        time.Sleep(3 * time.Second)
        return nil
    }
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan WithCancel untuk mencipta Konteks boleh dibatalkan dan tunggu selama 2 saat dalam goroutine sebelum memanggil fungsi batal untuk membatalkan operasi. . Dalam fungsi perniagaan, kami menggunakan pernyataan pilih untuk mendengar mesej daripada saluran ctx.Done() Jika mesej diterima, ini bermakna Konteks dibatalkan dan ralat dikembalikan.

WithTimeout adalah serupa dengan WithCancel, tetapi ia secara automatik membatalkan operasi dalam tempoh masa tertentu. Berikut ialah kod sampel yang menggunakan WithTimeout untuk pemprosesan tamat masa:

package main

import (
    "context"
    "errors"
    "fmt"
    "time"
)

func main() {
    ctx := context.Background()

    // 设置超时时间为2秒
    ctx, cancel := context.WithTimeout(ctx, 2*time.Second)
    defer cancel() // 到达超时时间后自动取消操作

    err := businessFunc(ctx)
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Success")
    }
}

func businessFunc(ctx context.Context) error {
    select {
    case <-ctx.Done():
        return errors.New("Timeout")
    default:
        // 执行一些操作
        time.Sleep(3 * time.Second)
        return nil
    }
}
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan WithTimeout untuk mencipta Konteks dengan tamat masa 2 saat dan menggunakan kata kunci tangguh untuk memanggil fungsi batal sebelum fungsi keluar ke membatalkannya secara automatik. Dalam fungsi perniagaan, kami menggunakan penyata pilih untuk memantau mesej saluran ctx.Done() Jika mesej diterima, ini bermakna tempoh tamat masa telah sampai dan ralat akan dikembalikan.

  1. Ringkasan

Dengan menggunakan pakej konteks bahasa Go, kami boleh mengendalikan ralat dengan lebih elegan dan menyebarkan maklumat ralat ke fungsi yang berkaitan. Pakej konteks menyediakan satu siri kaedah, seperti WithValue, WithCancel dan WithTimeout, untuk mengendalikan operasi berkaitan ralat dengan mudah. Dalam pembangunan sebenar, kita boleh memilih kaedah yang sesuai untuk pengendalian ralat berdasarkan keperluan dan senario tertentu.

Saya harap artikel ini dapat membantu pembaca menggunakan Go dan konteks untuk pengendalian ralat dengan anggun, dan meningkatkan kebolehbacaan, kebolehselenggaraan dan kestabilan kod.

Atas ialah kandungan terperinci Cara menggunakan Go dan konteks secara elegan untuk pengendalian ralat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk memadankan cap masa menggunakan ungkapan biasa dalam Go? Bagaimana untuk memadankan cap masa menggunakan ungkapan biasa dalam Go? Jun 02, 2024 am 09:00 AM

Dalam Go, anda boleh menggunakan ungkapan biasa untuk memadankan cap masa: susun rentetan ungkapan biasa, seperti yang digunakan untuk memadankan cap masa ISO8601: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Gunakan fungsi regexp.MatchString untuk menyemak sama ada rentetan sepadan dengan ungkapan biasa.

Bagaimana untuk menghantar mesej Go WebSocket? Bagaimana untuk menghantar mesej Go WebSocket? Jun 03, 2024 pm 04:53 PM

Dalam Go, mesej WebSocket boleh dihantar menggunakan pakej gorila/soket web. Langkah khusus: Wujudkan sambungan WebSocket. Hantar mesej teks: Panggil WriteMessage(websocket.TextMessage,[]bait("Mesej")). Hantar mesej binari: panggil WriteMessage(websocket.BinaryMessage,[]bait{1,2,3}).

Bagaimana untuk mengendalikan senario ralat dalam C++ dengan berkesan melalui pengendalian pengecualian? Bagaimana untuk mengendalikan senario ralat dalam C++ dengan berkesan melalui pengendalian pengecualian? Jun 02, 2024 pm 12:38 PM

Dalam C++, pengendalian pengecualian mengendalikan ralat dengan anggun melalui blok try-catch Jenis pengecualian biasa termasuk ralat masa jalan, ralat logik dan ralat luar sempadan. Ambil pengendalian ralat pembukaan fail sebagai contoh Apabila program gagal membuka fail, ia akan membuang pengecualian dan mencetak mesej ralat dan mengembalikan kod ralat melalui blok tangkapan, dengan itu mengendalikan ralat tanpa menamatkan program. Pengendalian pengecualian memberikan kelebihan seperti pemusatan pengendalian ralat, penyebaran ralat dan keteguhan kod.

Perbezaan antara bahasa Golang dan Go Perbezaan antara bahasa Golang dan Go May 31, 2024 pm 08:10 PM

Bahasa Go dan Go adalah entiti yang berbeza dengan ciri yang berbeza. Go (juga dikenali sebagai Golang) terkenal dengan kesesuaiannya, kelajuan penyusunan pantas, pengurusan memori dan kelebihan merentas platform. Kelemahan bahasa Go termasuk ekosistem yang kurang kaya berbanding bahasa lain, sintaks yang lebih ketat dan kekurangan penaipan dinamik.

Bagaimana untuk melakukan pengendalian ralat dan log masuk dalam reka bentuk kelas C++? Bagaimana untuk melakukan pengendalian ralat dan log masuk dalam reka bentuk kelas C++? Jun 02, 2024 am 09:45 AM

Ralat pengendalian dan log masuk dalam reka bentuk kelas C++ termasuk: Pengendalian pengecualian: menangkap dan mengendalikan pengecualian, menggunakan kelas pengecualian tersuai untuk memberikan maklumat ralat khusus. Kod ralat: Gunakan integer atau penghitungan untuk mewakili keadaan ralat dan mengembalikannya dalam nilai pulangan. Penegasan: Sahkan syarat pra dan pasca, dan buang pengecualian jika ia tidak dipenuhi. Pengelogan perpustakaan C++: pengelogan asas menggunakan std::cerr dan std::clog. Perpustakaan pengelogan luaran: Integrasikan perpustakaan pihak ketiga untuk ciri lanjutan seperti penapisan tahap dan putaran fail log. Kelas log tersuai: Buat kelas log anda sendiri, abstrak mekanisme asas dan sediakan antara muka biasa untuk merekodkan tahap maklumat yang berbeza.

Bagaimana untuk mengelakkan kebocoran memori dalam pengoptimuman prestasi teknikal Golang? Bagaimana untuk mengelakkan kebocoran memori dalam pengoptimuman prestasi teknikal Golang? Jun 04, 2024 pm 12:27 PM

Kebocoran memori boleh menyebabkan memori program Go terus meningkat dengan: menutup sumber yang tidak lagi digunakan, seperti fail, sambungan rangkaian dan sambungan pangkalan data. Gunakan rujukan yang lemah untuk mengelakkan kebocoran memori dan objek sasaran untuk pengumpulan sampah apabila ia tidak lagi dirujuk dengan kuat. Menggunakan go coroutine, memori tindanan coroutine akan dikeluarkan secara automatik apabila keluar untuk mengelakkan kebocoran memori.

Alat dan perpustakaan terbaik untuk pengendalian ralat PHP? Alat dan perpustakaan terbaik untuk pengendalian ralat PHP? May 09, 2024 pm 09:51 PM

Alat dan perpustakaan pengendalian ralat terbaik dalam PHP termasuk: Kaedah terbina dalam: set_error_handler() dan error_get_last() Kit alat pihak ketiga: Whoops (penyahpepijat dan pemformatan ralat) Perkhidmatan pihak ketiga: Sentry (pelaporan dan pemantauan ralat) Pihak ketiga perpustakaan: PHP-error-handler (pengelogan ralat tersuai dan jejak tindanan) dan Monolog (pengendali pengelogan ralat)

Bagaimana untuk menggunakan pembungkus ralat Golang? Bagaimana untuk menggunakan pembungkus ralat Golang? Jun 03, 2024 pm 04:08 PM

Dalam Golang, pembalut ralat membolehkan anda membuat ralat baharu dengan menambahkan maklumat kontekstual kepada ralat asal. Ini boleh digunakan untuk menyatukan jenis ralat yang dilemparkan oleh perpustakaan atau komponen yang berbeza, memudahkan penyahpepijatan dan pengendalian ralat. Langkah-langkahnya adalah seperti berikut: Gunakan fungsi ralat. Balut untuk membalut ralat asal kepada ralat baharu. Ralat baharu mengandungi maklumat kontekstual daripada ralat asal. Gunakan fmt.Printf untuk mengeluarkan ralat yang dibalut, memberikan lebih konteks dan kebolehtindakan. Apabila mengendalikan pelbagai jenis ralat, gunakan fungsi ralat. Balut untuk menyatukan jenis ralat.

See all articles