Go 语言错误和恐慌处理

1. 错误处理机制

        Go 中的错误处理一直是一个两极分化的问题。由于对重复的错误处理样板感到沮丧,社区中的许多 Go 用户建议改进错误处理机制。这些建议中的大多数实际上都是错误传递的改进,因为说实话,错误很少得到处理。相反,它们被传递给调用者,有时包含一些上下文信息。

        许多错误处理建议提出了 throw-catch 的不同变体,而还有一些建议则只是所谓的 if err!=nil return err 的语法糖(syntactic sugar)。

        许多诸如此类的建议都忽略了一点,即现有的错误报告和处理约定在并发环境中可以很好地工作,例如通过通道传递错误的能力:你可以在另一个 goroutine 中处理某个 goroutine 生成的错误。

        在使用 Go 程序时,我想强调的重要一点是,大多数时候,可以仅依靠屏幕上看到的信息来分析它们。所有可能的代码路径在代码中都是明确的。从这个意义上说,Go 是一种对阅读者极其友好的语言。Go 错误处理范式在这方面有一定功劳。许多函数可返回一些值并伴有错误信息。因此,程序如何处理错误通常在代码中是明确的。

        当检测到不可接受的情况(例如网络连接失败或用户输入无效)时,程序会生成错误。这些错误通常会被传递给调用者,有时会被包装在另一个错误中,以添加描述上下文的信息,添加的信息很重要,因为许多错误都会被转换为程序用户的消息。例如,抱怨 JSON 解析错误的消息在处理许多 JSON 文件的程序中是没有用的,除非它还告诉哪个文件有错误。

        但 goroutine 不会返回错误。当 goroutine 失败时,我们必须找到其他方法来处理错误。

        当多个 goroutine 用于计算的不同部分,并且其中一个 goroutine 失败时,其余的 goroutine 也应该被取消,或者它们的结果将被丢弃。

        有时,多个 goroutine 失败,你必须处理多个错误值。请记住,我们的第一条准则是:永远不要忽略错误。很少有指南和第三方软件包会帮你轻松处理错误。

1.1 常见错误处理模式

        现在让我们来看一些常见的模式。你如果向 goroutine 提交工作并希望稍后收到结果,那么必须确保结果中包含错误信息。如果你有多个可以同时执行的任务,那么以下演示的模式非常有用。你可以在自己的 goroutine 中启动每个任务,然后根据需要收集结果或错误。当你有工作池时,这也是处理错误的好方法:

// 结果类型将保留期望的结果和错误信息
type Result1 struct {
    Result ResultType1
    Error err
}

type Result2 struct {
    Result ResultType2
    Error err
}

...

result1Ch:=make(chan Result1)
go func( ){
    result,err := handleRequest1()
    result1Ch <- Result1 {Result: result,Error:err}
}()

result2Ch:=make(chan Resul
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mindfulness code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值