登录
首页 >  Golang >  Go问答

在 golang 中捕获 panic()

来源:Golang技术栈

时间:2023-04-04 17:18:25 278浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《在 golang 中捕获 panic()》,以下内容主要包含golang等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我们有一个使用记录器(实际上是自定义记录器)的大型 golang 应用程序,将输出写入定期轮换的日志文件。

但是,当应用程序崩溃或 panic() 时,这些消息会变成标准错误。

有没有办法覆盖恐慌功能来使用我们的记录器?

正确答案

据我所知,您无法将恐慌的输出从标准错误重定向到您的记录器。您可以做的最好的事情是将标准错误重定向到您可以在外部或程序内部执行的文件。

对于我的rclone程序,我重定向了标准错误以将所有内容捕获到一个选项上的文件中,不幸的是,这在跨平台方式中并不是特别容易做到的。这是我的做法(请参阅 redirect*.go 文件)

对于 linux/unix

// Log the panic under unix to the log file

//+build unix

package main

import (
    "log"
    "os"
    "syscall"
)

// redirectStderr to the file passed in
func redirectStderr(f *os.File) {
    err := syscall.Dup2(int(f.Fd()), int(os.Stderr.Fd()))
    if err != nil {
        log.Fatalf("Failed to redirect stderr to file: %v", err)
    }
}

对于窗户

// Log the panic under windows to the log file
//
// Code from minix, via
//
// http://play.golang.org/p/kLtct7lSUg

//+build windows

package main

import (
    "log"
    "os"
    "syscall"
)

var (
    kernel32         = syscall.MustLoadDLL("kernel32.dll")
    procSetStdHandle = kernel32.MustFindProc("SetStdHandle")
)

func setStdHandle(stdhandle int32, handle syscall.Handle) error {
    r0, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0)
    if r0 == 0 {
        if e1 != 0 {
            return error(e1)
        }
        return syscall.EINVAL
    }
    return nil
}

// redirectStderr to the file passed in
func redirectStderr(f *os.File) {
    err := setStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd()))
    if err != nil {
        log.Fatalf("Failed to redirect stderr to file: %v", err)
    }
    // SetStdHandle does not affect prior references to stderr
    os.Stderr = f
}

今天带大家了解了golang的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>