gpt4 book ai didi

http - 如何在golang中使用运行时错误?

转载 作者:IT王子 更新时间:2023-10-29 01:18:49 26 4
gpt4 key购买 nike

我正在尝试从 3 个服务器下载一些东西。我的想法是,如果第一台服务器关闭,它将使用第二台服务器。我注意到,如果第一个服务器已经关闭,它会产生一个运行时错误。我想知道如何使用这个错误,我需要的是这样的:

if run time err!=nil{do something}

我是golang的新手,希望有人能帮助我谢谢

最佳答案

为了详细说明 FUZxxl 所解释的内容,go 区分了错误(可能出错的事情确实出错了)和异常(不可能出错的事情)出错实际上出错了)。

这种区别有时可能很微妙(因为它依赖于“意外”),但它也可能比您在其他语言中看到的“一切都是异常(exception)”更清晰。

例如,考虑可能溢出的整数。一种可能性是将其视为“正常”行为,应妥善处理:

func safe_add(x, y uint32) (uint32, error) {
z := x + y
if z < x || z < y {
return 0, fmt.Errorf("Integer overflow")
}
return z, nil
}

另一种方法是将其视为“永远不会发生”,并在极少数情况下发生运行时 panic:

func panic_add(x, y uint32) uint32 {
z, err := safe_add(x, y)
if err != nil {
panic(err)
}
return z
}

(请注意,我在这里使用我自己的“safe_add”,但您当然不必这样做)

主要区别在于您之后处理错误的方式。向自身添加一个数字,直到它因 error 而溢出,给出:

func safeloop(u uint32) {
var err error
for {
if u, err = safe_add(u, u); err != nil {
fmt.Println(err)
return
} else {
fmt.Println(u)
}
}
}

处理 panic 时使用 recover 内置函数:

func panicloop(u uint32) {
defer func() {
if err := recover(); err != nil {
fmt.Println(err)
}
}()
for {
u = panic_add(u, u)
fmt.Println(u)
}
}

(关于 the playground 的完整示例)

请注意, panic 版本有一个更简单的循环,因为您基本上从不期望出现任何问题并且从不检查错误。与此相对应的是,处理 panic 的方法非常繁琐,即使对于像这样的非常简单的示例也是如此。您defer 一个函数,该函数将调用recover 并在错误出现和中断时捕获错误。当您的代码变得更加复杂时,准确跟踪 panic 发生的位置/方式并相应地采取行动可能会比在可能出现错误的地方检查错误复杂得多,结果是, err := func_which_may_fail(...) 模式。

您甚至可以在 panics 之间切换,恢复返回错误,错误转换为 panics,...但这(可以理解)被认为是糟糕的设计。

error handling 上有一些很好的资源和 panics在旅途中的博客。 specs是一本好书。

在您的情况下,正如您所期望的“服务器已关闭”是一种非常频繁的行为,您绝对应该按照 FUZxxl 的建议采用 error 方式,但我希望这可能对您(或其他人)了解 Go 中错误处理的工作原理。

关于http - 如何在golang中使用运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19921060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com