go - 如何处理 defer 语句中的错误
问题描述
所以我有这个:
defer res.Body.Close()
问题是这个调用可能会返回一个非零错误。所以我认为正确捕获错误的唯一方法是使用这个
defer func(){
if err := defer res.Body.Close(); err !=nil {
log.Error(err);
}
}()
还有其他方法吗?
解决方案
你真的不能
err: = defer res.Body.Close ()
像这样做出这样的声明。因此这个说法是无效的。以下是有效的。
defer func(){
if err := res.Body.Close(); err !=nil {
log.Error(err);
}
}()
此外,还有另一种处理 defer 语句中的错误的方法,如下所示。
func do() error {
res, err := http.Get("http://notexists")
if res != nil {
defer res.Body.Close()
}
if err != nil {
return err
}
// ..code...
return nil
}
上面的代码,当有错误时,代码会返回错误,否则会在函数defer返回时关闭res.Body。
您可以访问https://blog.learngoprogramming.com/5-gotchas-of-defer-in-go-golang-part-iii-36a1ab3d6ef1了解更多信息。
推荐阅读
- c++ - 在tensorflow中创建新操作时指定shapehandle的形状(输出张量的秩问题)
- css - 模拟器检查外观上的元素
- java - java多线程环境中是否有避免第二次执行类的最佳方法?
- python - 使用多处理报告 OSError 加速 DEAP
- asp.net-mvc - 长时间运行过程中频繁刷新网页
- c++ - 如何在 STM32L475 的 FLASH 内存中交换来自不同存储库的两个内存区域?
- c# - 使 NSwag 生成的客户端中的属性可以为空
- oracle - 无法使用 unixODBC 连接到 Oracle 19
- c# - 使用 Windows 身份验证的 REST API
- security - OAauth2 - 根据范围、声明或两者设置权限?