英文:
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)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论