当前位置: 首页 > 面试题库 >

在golang中捕获panic()

陆沈浪
2023-03-14
问题内容

我们有一个大型的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
}


 类似资料:
  • 问题内容: 我想在Go中实现“流程包装器”。基本上它将执行的是启动一个进程(比如说一个节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号…) 我认为要做的方法是使用以下命令在go例程中启动节点服务器: 然后,我想捕获由执行的命令生成的所有可能的信号。我是Go的新手,我们将不胜感激。 问题答案: Go中有三种执行程序的方式: 包含syscall.Exec,syscall.Fork

  • 问题内容: 所以我的go脚本会像这样调用外部python 它同时运行我的python脚本,真棒。但是现在的问题是,我的python脚本将无限运行,并且会不时输出一些信息。我想“捕获”这些Stdout,并在golang终端上将它们打印出来。如何同时执行(不等待我的python脚本退出)? 问题答案: 使用和代替。 https://golang.org/pkg/os/exec/#Cmd.Run 运行将

  • 我想寻求帮助,了解如何在JUnit测试中捕获IOException,以测试我的代码在发生错误时是否会抛出正确的异常。 以下是我的主要代码: 这是我的JUnit: 我想我必须在JUnit测试中创建一个错误的路径来抛出该异常,但我没能得到我想要的结果。我很感谢你的帮助。谢谢

  • 问题内容: 测试代码如下: 我认为输出将是:java,python,erlang,cpp,go;但是输出是:go go go go go; 怎么了 问题答案: 就是这样写函数,把动词变成函数

  • 问题内容: 我在游乐场中获得了以下代码: 因此很明显,该函数会引发错误: 执行被中断,原因:EXC_BAD_INSTRUCTION 有没有办法抓住这个?我在线阅读文章,为Array类编写一个下标,该下标始终检查范围,但问题更大:我无法捕捉任何东西吗? 问题答案: 在Swift中,您什么都做不到。您只能赶上 错误 与抛出由被称为目标C代码的其他银行代码或错误,类型NSError一套说法。 默认的数组

  • 问题内容: 我使用jQuery向服务器发出AJAX POST请求,该请求可以返回状态为302的HTTP响应。然后JavaScript只是将GET请求发送到此URL,而我想在此响应中将用户重定向到URL。这可能吗? 问题答案: 由于给出的原因,接受的答案不起作用。我发表了评论,并提供了一个指向问题的链接,该问题描述了一种黑客程序 但是,这有点肮脏,在深入研究之后,我发现我认为是更好的解决方案- 使用