如何使用Golang准确标记错误的行数

huangapple go评论79阅读模式
英文:

How to mark errors accurate to line with golang

问题

我看到了你的问题,你想知道如何在函数C()中定位错误的行号。根据你提供的代码,函数C()中的错误行号可以通过在FancyHandleError函数中的log.Printf语句中添加一些额外的信息来获取。你可以将函数C()的行号作为参数传递给FancyHandleError函数,然后在log.Printf语句中使用该参数来打印错误的位置。

以下是修改后的代码示例:

func FancyHandleError(err error, line int) (b bool) {
    if err != nil {
        pc, fn, _, _ := runtime.Caller(1)
        log.Printf("[error] in %s[%s:%d] %v", runtime.FuncForPC(pc).Name(), fn, line, err)
        b = true
    }
    return
}

func main(){
    FancyHandleError(funcA(), 23) // 将函数C()的行号作为参数传递给FancyHandleError函数
}

func funcA() error {
    err := funcB()
    return err
}

func funcB() error {
    err := funcC()
    return err
}

func funcC() error {
    err := errors.New("deep errors!!")
    return err
}

通过将函数C()的行号作为参数传递给FancyHandleError函数,并在log.Printf语句中使用该参数,你将能够打印出函数C()中错误的位置信息。

英文:

I have seem this answer and use @OneOfOne answers.
https://stackoverflow.com/questions/24809287/how-do-you-get-a-golang-program-to-print-the-line-number-of-the-error-it-just-ca

But there is some questions.

func FancyHandleError(err error) (b bool) {
    if err != nil {
        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(){
    FancyHandleError(funcA())
}

func funcA()error{
    err := funcB()
    return err
}

func funcB()error{
    err := funcC()
    return err
}

func funcC()error{
    err := errors.New("deep errors!!") //I want to get the location in here!!!!!!!!!!!!!!!!!!!!!!
    return err
}

It will print "[error] in main.main[/root/temp/error.go:23]"
That is in function main's line number.

But how to locate the error's line number in function C()?

答案1

得分: 5

请看runtime.Caller,它会提供你所需的所有细节。

你的自定义NewError函数可能如下所示:

func NewError(message string) error {
    _, file, line, _ := runtime.Caller(1)
    return fmt.Errorf("[%s][%d] : %s", file, line, message)
}

这是一个示例的play链接

英文:

See runtime.Caller which will give you all the details you need.

Your custom NewError function may look like this:

func NewError(message string) error {
	_, file, line, _ := runtime.Caller(1)
    return fmt.Errorf("[%s][%d] : %s" , file, line, message)
}

Here is play link for a sample play

答案2

得分: 0

如果你正在使用log包,你可以指示logger在日志条目前添加各种信息。

log.SetFlags(log.Lshortfile)
英文:

If you're using the log package, you can instruct the logger to prefix the entries with various information.

log.SetFlags(log.Lshortfile)

huangapple
  • 本文由 发表于 2016年12月28日 16:15:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/41357993.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定