当前位置: 首页 > 知识库问答 >
问题:

在戈朗捕捉恐慌()

孟子墨
2023-03-14

有什么方法可以重写panic功能来使用我们的记录器吗?

共有1个答案

金钊
2023-03-14

据我所知,您不能将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请帮助我,谢谢!

  • 问题内容: 我正在将算法从C移植到Go。我有些困惑。这是C函数: 在for循环中,将值s分配给元素cd数组x。这怎么可能?据我所知,长双精度数是float64(在Go上下文中)。因此,我不应该编译C代码,因为我正在向只包含uint64元素的数组分配一个long double。但是C代码可以正常工作。 那么有人可以解释为什么这行得通吗? 非常感谢你。 更新: 该函数的原始C代码可以在以下位置找到:h

  • 用围棋的语言, 是一个字符串数组 我们还使用作为参数。 有什么区别? 功能定义: 我可以像下面那样调用这个函数吗?

  • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

  • 问题内容: 在Java中是否有捕捉到内存不足错误()的问题? 问题答案: 是的 。以下是一些可能有意义的示例: 如果您想通过 优雅地关闭 程序来处理它 如果要向用户显示问题或 记录错误 根据您的设计,您甚至可以清理内存并 恢复工作状态 但是 ,请注意,通常情况下(除非您处在一次要分配大量内存的位置),对于这些情况,您可能不会专门捕获OutOfMemoryError,而是始终在顶部进行操作主要入口点