0
1
panic occured: got 2
3
4
.
.
.
.
.
10
0
1
panic occured got: got 2
代码块:
package main
import "fmt"
func main() {
goFrom1To10()
}
func goFrom1To10() {
defer recovery()
for i := 0; i <= 10; i++ {
if i == 2 {
panic("got 2")
}
fmt.Println(i)
}
}
func recovery() {
if r := recover(); r != nil {
fmt.Println("panic occured: ", r)
}
}
这是否可以在围棋中实现,就像当恐慌发生时,我们可以以某种方式恢复并完成我们的循环?
如果循环的主体是作为一个函数执行的,可以是匿名的,也可以是命名的,并且在该函数中使用一个延迟的函数来恢复,则可以这样做。
下面是匿名函数的外观:
func goFrom1To10() {
for i := 0; i <= 10; i++ {
func() {
defer func() {
if r := recover(); r != nil {
fmt.Println("panic occured: ", r)
}
}()
if i == 2 {
panic("got 2")
}
fmt.Println(i)
}()
}
}
输出(在围棋操场上试试):
0
1
panic occured: got 2
3
4
5
6
7
8
9
10
func goFrom1To10() {
for i := 0; i <= 10; i++ {
task(i)
}
}
func task(i int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("panic occured: ", r)
}
}()
if i == 2 {
panic("got 2")
}
fmt.Println(i)
}
我有以下代码: 在错误处理和从恐慌中恢复方面,他们的东西是我遗漏的。我是新来的,所以想要一些建议。
问题内容: 在defer函数中,我想查看一次恢复调用是否会产生非nil值(不恢复) 可能吗? 问题答案: 那确切的事情是不可能的。您可能只想重新恐慌,就像在其他语言中重新引发异常一样。
我试图从我的程序中创建的go例程中捕捉崩溃/恐慌,以便将它们发送到我的崩溃错误报告服务器(如Sentry/Raygun) 例如, 做这件事的惯用方法是什么?
问题内容: 我曾经认为,如果goroutine中的恐慌的调用者在恐慌之前完成,它将使其终止程序(延迟恢复没有任何帮助,因为此时还没有发生恐慌), 直到我尝试以下代码: 我发现无论调用者函数完成与否,如果goroutines开始恐慌,调用者的延迟恢复机制将无济于事。整个程序仍然无效。 所以为什么?理论上,调用者功能仍在运行。当出现紧急情况时,调用者的延迟功能应起作用(包括恢复)。 问题答案: 该规范
我正在学习围棋,我试图理解如何正确处理来自外部包的恐慌。 调用doFoo方法会使服务器崩溃,我认为这是正确的行为,因为应用程序现在处于受损状态。最好是崩溃,然后通过某个负载均衡器将后续请求转发到不同的进程。但是,我的api服务器可能还在为其他客户机服务,它可能在维护websockets,而且我可能还想在这里返回一个500错误。 来自nodejs,我习惯了处理未捕获的同步异常和处理未捕获的异步异常的