go - 创建专用函数是处理错误的好方法吗
问题描述
我最近看了Liz Rice 的这个演讲(我强烈推荐!),我看到了,而不是写:
func main() {
if err := someFunc(); err != nil {
panic(err)
}
}
她这样做:
func main() {
must(someFunc())
}
func must(err error) {
panic(err)
}
这是处理错误的惯用方式吗?IMO 它并没有提高可读性,我觉得它没有遵循Go 谚语“清晰胜于聪明”。你怎么看?
解决方案
该模式在运行时可能MustXXX(error)
出现时很有用,但它是否确实在编译时决定。这意味着如果源代码是它应该是的,错误将不会在运行时发生。error
闪亮的例子是template.Must()
和regexp.MustCompile()
。如果您在源代码中提供了有效的模板或有效的正则表达式,则在运行时解析它们将永远不会失败。在这些情况下,使用Must()
会产生更短更清晰的代码。应提供测试以检测源中是否使用了无效的模板或正则表达式,以便及早检测到错误(运行测试时)。
除此之外(当基于运行时条件(如用户输入、从外部源读取的数据等)可能发生错误时),Must()
显然不建议使用该模式,您应该正确处理错误。
参见相关:单值上下文中的多个值
推荐阅读
- java - 想要我的 webview 的 Internet 警报框
- sql - 可以结合日期和时间并存储为日期时间格式
- javascript - 在多个元素中将进度条显示为滚动
- javascript - 使用计算将对象数组转换为数组
- jquery - Laravel Uncaught ReferenceError: $ 未定义。带css动画
- java - “集合不包含某个项目”的 JPA 查询
- typescript - CastError: 值“{ userId: '5c48a95df9bd9a33c0ff9405' 转换为 ObjectId 失败”
- python - PostgreSQL SQLalchemy和带时区的时间戳,为什么隐身与正常不同?
- c# - EnsureDatabase.For.SqlDatabase 抛出异常
- c# - 使用 linq 确定 SelectListItem 列表中的选定项目