用SetStdHandle重定向golang的panic信息

本文介绍了一种改进的Go语言错误捕获方法,通过将错误输出重定向到文件,确保即使在goroutine并发环境下也能完整保留panic信息,避免因控制台显示限制导致的重要错误信息丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


go程序一般都会有很多的goroutine,panic打印了满屏的goroutine的信息,而且windows自带的控制台能显示的信息很有限,这样就出错的提示信息总是会被刷掉了。以前用过console2来替代控制台,但是这个软件不是很友好,通常显示的信息的格式问题比较多,而且汉字显示问题很大。今天又仔细的研究了下发现以前网上看的的SetStdHandle代码改动下就可以了。代码如下,只要把var f *os.File这个作为全局变量就可以了




import (
	"code.google.com/p/log4go"
	"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
}

var f *os.File

func redirect_err() {
	var err error
	f, err = os.Create(`panic.txt`)
	if err != nil {
		log4go.Error("os.Create failed: %v", err)
	}
	err = SetStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd()))
	if err != nil {
		log4go.Error("SetStdHandle failed: %v", err)
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值