io - 从模板执行中过滤掉损坏的管道错误

标签 io go system-calls broken-pipe epipe

这类似于 Filter out broken pipe errors ,但有一些并发症 - 当用户在执行模板(html/template.Execute 或 text/template.Execute)时按下浏览器上的“停止”按钮时,会发生管道损坏错误。

但是,我相信 text/template 包返回的错误只是 *errors.errorString 类型,因为损坏的管道消息似乎包含在其他一些信息文本中,因此无法对 net 进行类型断言。 OpErr 用于比较目的。

例如,典型的破损管道错误字符串如下所示

write tcp 127.0.0.1:60739: broken pipe

执行模板返回的损坏的管道错误字符串如下所示:

template: header.html:1:0: executing "header.html" at <div id="header...>: write tcp 127.0.0.1:60739: broken pipe

我有一个用 Go 编写的生产 Web 应用程序,我厌倦了在我的其余错误日志中直观地过滤掉破损的管道错误,但现在除了使用像字符串这样的脏东西之外,我不知道如何过滤掉破损的管道。包含。

最佳答案

只是要发布最终成为对我有用的包装器的东西。如果有人发现任何问题,请随时提出意见。

type templateWriter struct {
    writer io.Writer
}

func (w templateWriter) Write(p []byte) (int, error) {
    n, err := w.writer.Write(p)
    if err != nil {
        // Filter out broken pipe (user pressed "stop") errors
        if nErr, ok := err.(*net.OpError); ok {
            if nErr.Err == syscall.EPIPE {
                return n, nil
            }
        }
    }
    return n, err
}

关于io - 从模板执行中过滤掉损坏的管道错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26853200/

相关文章:

haskell - IO monad 中的函数组合

Java - 从第二行开始读取文本文件

go - 如何从 google-api-go-client 将日程设置到 Google 日历?

c - 从 `data.in` 读取并在 C 中写入 `data.out` 时出现问题

c - 为什么管道的容量有限?

io - FORTH 包括与负载?

c# - 等到文件完全写入

go - 缓冲长度礼仪

go - 使用 gocql 驱动程序在 Cassandra 中存储 byte slice

c - 内核模块与 sys_call 交互