功能失败时删除文件
Remove file on function failure
如果我运行这个代码:
package main
import "os"
func pass() bool { return false }
func main() {
f, e := os.Create("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
if ! pass() {
e := os.Remove("file.txt")
if e != nil {
panic(e)
}
}
}
我得到这个结果:
The process cannot access the file because it is being used by another process.
如果我这样做,我会得到预期的结果:
defer f.Close()
if ! pass() {
f.Close()
e := os.Remove("file.txt")
if e != nil {
panic(e)
}
}
但我想尽可能避免重复 Close()
。该文件始终需要关闭,但如果某些功能失败,也需要将其删除。是否有更好的方法可用于我正在尝试做的事情?回应评论:该文件将从多个 HTTP 请求写入。有可能第一个请求通过,第二个请求失败。
如果这种情况经常出现,那么创建一个辅助函数:
func nuke(f *os.File) {
name := f.Name()
f.Close()
if err := os.Remove(name); err != nil {
panic(err)
}
}
这样使用:
func main() {
f, e := os.Create("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
if ! pass() {
nuke(f)
}
}
如果我运行这个代码:
package main
import "os"
func pass() bool { return false }
func main() {
f, e := os.Create("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
if ! pass() {
e := os.Remove("file.txt")
if e != nil {
panic(e)
}
}
}
我得到这个结果:
The process cannot access the file because it is being used by another process.
如果我这样做,我会得到预期的结果:
defer f.Close()
if ! pass() {
f.Close()
e := os.Remove("file.txt")
if e != nil {
panic(e)
}
}
但我想尽可能避免重复 Close()
。该文件始终需要关闭,但如果某些功能失败,也需要将其删除。是否有更好的方法可用于我正在尝试做的事情?回应评论:该文件将从多个 HTTP 请求写入。有可能第一个请求通过,第二个请求失败。
如果这种情况经常出现,那么创建一个辅助函数:
func nuke(f *os.File) {
name := f.Name()
f.Close()
if err := os.Remove(name); err != nil {
panic(err)
}
}
这样使用:
func main() {
f, e := os.Create("file.txt")
if e != nil {
panic(e)
}
defer f.Close()
if ! pass() {
nuke(f)
}
}