【发布时间】:2018-04-25 18:50:11
【问题描述】:
我在 go 例程和通道方面遇到了一些关于错误处理的问题。
首先我有一个监听消息的函数(在无限循环中):
func main() {
messageChannel := make(chan messageHandler.MessageInfo)
for {
if token := client.Subscribe("#", 0, func(client MQTT.Client, msg MQTT.Message) {
go messageHandler.DecodeMessage(msg, messageChannel)
select {
case messageInfo := <-messageChannel:
//Handle
}
}); token.Wait() && token.Error() != nil {
fmt.Println(token.Error())
}
}
}
但在 DecodeMessage 函数中,可能会出现多个错误。
func DecodeMessage(msg mqtt.Message, c1 chan MessageInfo) {
//do something, might result in error
//do another thing, might result in error
c1 <- MessageInfo{...}
}
通常我会从函数中返回。但是对于例程来说似乎有点棘手。我查看了this post,但如果两个错误都会发生,我只会看到最后一条错误消息。
例子:
func DecodeMessage(msg mqtt.Message, c1 chan MessageInfo) {
var returnError error
if err != nil {
returnError = err
}
if err != nil {
returnError = err
}
c1 <- MessageInfo{
Error: returnError,
...
}
}
我应该有一个某种数组并附加所有错误吗?在一个例程中出现多个错误是不好的做法吗?
对我来说,最好的事情是例程会在出现错误时退出并像“正常”一样返回该错误。这可能吗?
【问题讨论】:
-
你能澄清为什么在第一个错误之后你不能返回吗?为什么你需要在第一个错误之后继续
DecodeMessage中的下一件事? -
我该怎么做?我可以像往常一样使用 return 吗?
-
是的。这种模式很常见,在其他方面看起来非常类似于你的典型 Go 模式
if err != nil { return err } -
但我读到了这个:stackoverflow.com/questions/20945069/…,它说这是个坏主意。
-
@gel 如果你有一个正常的函数,你会在第一个错误之后继续处理吗?如果没有,也不要在这里做。在通道上传递错误并返回。或者也许更好——在
DecodeMessage中完全避免通道并处理该函数之外的通道发送。也可能更容易测试它。
标签: go