go - 尝试:除了:通过但在 Go 中?(当出现网络问题时让 Go 不会崩溃?)
问题描述
有时我尝试抓取页面(几个 RSS;s 和图像站点)但有时会出现连接错误时遇到问题
您如何处理 Go 错误而无需处理/处理而 Go 不会自行崩溃?
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
type Manager struct {
threadCount int
}
var (
message = map[string]interface{}{}
messageMutex = sync.RWMutex{}
)
func startGo(bManager Manager) {
for{
messageMutex.RLock()
fmt.Println("hey")
ScrapeImages()
messageMutex.RUnlock()
}
}
func main() {
rand.Seed(time.Now().UnixNano())
stall := make(chan struct{})
bManager := Manager{
threadCount: 5,
}
for i := 0; i < bManager.threadCount; i++ {
go startGo(bManager)
}
<-stall
}
解决方案
Go 鼓励程序员处理错误而不是忽略它们。有关详细信息,请参阅此帖子:https ://blog.golang.org/error-handling-and-go
也就是说,Go 也不会“在出现网络问题时崩溃”。当出现问题时,这些net/http
函数将返回错误,您可以在程序中根据需要处理这些错误。例如,在您的情况下ScrapeImages
可能会返回一个error
.
如果你有panics
s 的代码,你可以用它recover
来捕捉恐慌并以某种方式做出反应。except: pass
正如您所提到的,在非常近似的方式上,这类似于 Python 的。例如,net/http
HTTP 服务器通过注销错误并继续服务其他请求来从处理程序中的恐慌中恢复。因此,处理一个请求时的恐慌不会导致整个服务器崩溃。
推荐阅读
- cordova - 科尔多瓦的“恢复和保存状态”?
- javascript - 在 chromev73 中阻止 jaavscript 时,我看到空白页而不是呈现网页
- c - 打开 FIFO 以及写入/读取 FIFO 的超时
- css - div 样式对输入类型文本不起作用
- macos - macOS 屏幕保护程序键盘交互
- c++ - 如何根据登录创建单独的菜单
- java - @Query 不接受 LIKE 来执行细粒度搜索
- java - 如何检查应用程序是否安装了我的链接或已取消?
- redux - 如何将查询缩减器、removekey 和其他模块从 admin-on-rest 导入到自定义列表?
- c++ - 将智能指针传递给模板类成员函数时出现编译错误