"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como retornar um erro se uma função Go entrar em pânico?

Como retornar um erro se uma função Go entrar em pânico?

Publicado em 2024-11-18
Navegar:593

How to Return an Error if a Go Function Panics?

Retornando do adiamento no Go

Você está encontrando um problema em que deseja retornar um erro se uma função entrar em pânico no Go. Aqui está uma análise e uma correção para seu código:

func getReport(filename string) (rep report, err error) {
    rep.data = make(map[string]float64)

    defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
            switch x := r.(type) {
            case string:
                err = errors.New(x)
            case error:
                err = x
            default:
                err = errors.New("Unknown panic")
            }
            rep = nil // Invalidate rep
        }
    }()
    panic("Report format not recognized.")
    // rest of the getReport function...
}

Conceito de pânico e adiamento

  • Pânico: Um pânico sinaliza um erro de tempo de execução que pode ser detectado por uma recuperação em um função defer.
  • Defer: Uma instrução defer atrasa a execução de uma função até que a função circundante sai.

Modificações no código:

  • A função defer agora usa instruções switch-case para manipular o valor recuperado corretamente.
  • Se o valor recuperado for uma string, ele será convertido em um erro usando erros.New().
  • A variável rep é invalidada após um erro para garantir que não retorne quaisquer dados.
  • A variável rep é retornada como nula em caso de erro, o que corresponde à assinatura de sua função original.

Com essas alterações, sua função getReport retornará um erro se entra em pânico devido a um formato de relatório inválido. A mensagem de erro será o valor de pânico (se for uma string) ou um erro genérico indicando um pânico desconhecido.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3