英文:
Golang log.Fatal change line number in fatal error
问题
这个程序输出了以下内容:
app: 2015/10/24 11:28:15 example.go:22: 打开一些不存在的文件: 没有这样的文件或目录
这对应于fatal
函数内部的一行代码,而不是逻辑上生成/处理错误的main
函数内部。我有很多重复的错误处理代码,我想将其封装在一个函数中,但我不想失去具有信息性的行号的便利性。如何使我的fatal
函数对与日志消息关联行号的机制透明,或者如何提前生成行号?
如果Go语言有预处理器/宏系统,这将是一个很好的用途。
package main
import (
"log"
"os"
)
// 配置为输出应用程序名称、行号、时间戳等的日志记录器
var mylog = log.New(os.Stderr, "app: ", log.LstdFlags|log.Lshortfile)
// 为了避免重复的错误处理代码,例如
//
// result, err := someOperation(argument0, argument1)
// if err != nil {
// mylog.Fatal(err)
// }
//
// 我定义了以下函数
func fatal(err error) {
if err != nil {
mylog.Fatal(err)
}
}
func main() {
_, err := os.Open("some-crazy-non-existent-file")
fatal(err)
}
英文:
This program emits
app: 2015/10/24 11:28:15 example.go:22: open some-crazy-non-existent-file: no such file or directory
which corresponds to a line inside the fatal
function
instead of inside main
where the error is logically being generated/handled. I have a lot of repetitive error handling code that I want to wrap in a function, but I don't want to lose the convenience of informative line numbers. How do I make my fatal
function transparent to whatever mechanism associates line numbers with log messages, or generate the line number earlier?
This would be a wonderful use of a preprocessor / macro system if golang had one
package main
import (
"log"
"os"
)
// logger configured to emit app name, line number, timestamps etc.
var mylog = log.New(os.Stderr, "app: ", log.LstdFlags|log.Lshortfile)
// in order to avoid repetitive error handling code like
//
// result, err := someOperation(argument0, argument1)
// if err != nil {
// mylog.Fatal(err)
// }
//
// I defined the following function
func fatal(err error) {
if err != nil {
mylog.Fatal(err)
}
}
func main() {
_, err := os.Open("some-crazy-non-existent-file")
fatal(err)
}
答案1
得分: 3
你可以使用runtime.Caller(1)
来获取调用你的致命函数的行号。
这里有一个在Play上的示例。
英文:
you can get the line number of whatever called your fatal function using runtime.Caller(1)
Here's an example on Play
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论