variable try practices how handling golang exceptions error code catch best error-handling go

error handling - try - ¿Cómo se obtiene un programa de Golang para imprimir el número de línea del error que acaba de llamar?



throw error in golang (2)

Estaba tratando de lanzar errores en mi programa Golang con log.Fatal pero, log.Fatal no también imprime la línea donde se ejecutó el log.Fatal . ¿No hay forma de obtener acceso al número de línea que llamó log.Fatal? es decir, ¿hay alguna manera de obtener el número de línea cuando se arroja un error?

Estaba tratando de googlear esto pero no estaba seguro de cómo. Lo mejor que pude conseguir fue imprimir la traza de la pila , lo que supongo que es bueno, pero podría ser un poco demasiado. Tampoco quiero escribir debug.PrintStack() cada vez que necesito el número de línea, me sorprende que no haya ninguna función incorporada para esto como log.FatalStackTrace() o algo que no sea disfraz.

Además, la razón por la que no quiero hacer mi propio manejo de errores / errores es porque no quiero que las personas tengan que aprender a usar mi código especial de manejo de disfraces. Solo quiero algo estándar donde las personas puedan leer mi código más tarde y ser como

"ah ok, entonces está lanzando un error y haciendo X ..."

Cuanta menos gente tenga que aprender sobre mi código, mejor :)


Puede configurar los indicadores en un registrador personalizado o por defecto para incluir Llongfile o Lshortfile

// to change the flags on the default logger log.SetFlags(log.LstdFlags | log.Lshortfile)


Version corta, no hay nada directamente integrado en Sin embargo, puede implementarlo con una curva de aprendizaje mínima utilizando el tiempo de runtime.Caller

func HandleError(err error) (b bool) { if err != nil { // notice that we''re using 1, so it will actually log where // the error happened, 0 = this function, we don''t want that. _, fn, line, _ := runtime.Caller(1) log.Printf("[error] %s:%d %v", fn, line, err) b = true } return } //this logs the function name as well. func FancyHandleError(err error) (b bool) { if err != nil { // notice that we''re using 1, so it will actually log the where // the error happened, 0 = this function, we don''t want that. pc, fn, line, _ := runtime.Caller(1) log.Printf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err) b = true } return } func main() { if FancyHandleError(fmt.Errorf("it''s the end of the world")) { log.Print("stuff") } }

playground