Как вы получаете программу Golang для печати номера строки ошибки, которую она только что вызвала?
Я пытался бросить ошибки в моей программе Golang с log.Fatal
а, log.Fatal
также не печатает строку, где . Нет ли способа получить доступ к номеру строки, которая называется log.Роковой? т. е. есть ли способ получить номер строки при возникновении ошибки?
Я пытался google это, но не был уверен, как. Лучшее, что я мог получить, было печать трассировки стека, что, я думаю, хорошо, но может быть слишком много. Я тоже не хочу написать debug.PrintStack()
каждый раз, когда мне нужен номер строки, я просто удивлен, что нет встроенной функции для этого, как log.FatalStackTrace()
или что-то, что не костюм.
кроме того, причина, по которой я не хочу делать свою собственную отладку/обработку ошибок, заключается в том, что я не хочу, чтобы люди учились использовать мой специальный код обработки костюмов. Я просто хочу что-то стандартное, где люди могут прочитать мой код позже и быть как
"ну ладно, так его бросать ошибка и делать х.."
меньше людей должны узнать о моем коде, тем лучше :)
2 ответов
вы можете установить флаги на пользовательском регистраторе или по умолчанию включить Llongfile
или Lshortfile
// to change the flags on the default logger
log.SetFlags(log.LstdFlags | log.Lshortfile)
короткая версия, нет ничего непосредственно в, однако вы можете реализовать его с минимальной кривой обучения, используя 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")
}
}