Go 使用导致方法死机的相同参数重试该方法

Go 使用导致方法死机的相同参数重试该方法,go,Go,主程序包 输入“fmt” func测试(i int){ 延迟函数(){ 如果r:=recover();r!=nil{ fmt.Println(“内部恢复:”,r) } }() 对于try:=1;try我假设您想要测试任何可能使用此构造失败的函数,最好不必更改该函数。这是我的解决方案。希望这就是您所寻找的 注意:重试限制为5次,以防止无限循环。您可以将i传递给panic,这是recover返回的内容。但是,您很可能应该使用错误值。go中的panic主要用于无法恢复的意外错误。@kostya:我完

主程序包
输入“fmt”
func测试(i int){
延迟函数(){
如果r:=recover();r!=nil{
fmt.Println(“内部恢复:”,r)
}
}()

对于try:=1;try我假设您想要测试任何可能使用此构造失败的函数,最好不必更改该函数。这是我的解决方案。希望这就是您所寻找的


注意:重试限制为5次,以防止无限循环。

您可以将
i
传递给
panic
,这是
recover
返回的内容。但是,您很可能应该使用错误值。go中的panic主要用于无法恢复的意外错误。@kostya:我完全同意您的看法关于使用错误值。我的问题是,某些函数不完整,因此正在使用panic。我们只想确保服务器不会崩溃,并且可以处理下一个请求。您确定必须使用panic吗?从代码中,似乎返回第二个错误参数-godiomatic方式-更适合这种情况。仅供参考panic/recover不是我们在其他语言中所称的try/catch。错误用于Go中的错误处理。当程序无法访问数据库或文件系统(因此继续工作是毫无意义的)或其他外部(C)时,会使用paniclib无法按预期工作。因此,您是否建议在延迟恢复块中手动创建一个错误并返回它?正确。并基于此从外部再次调用函数。如果您尝试在延迟块中再次调用函数,则必须使用其他参数更改函数,以知道何时停止重试例子。
package main

import "fmt"

func test(i int){
    defer func(){
        if r := recover(); r != nil {
            fmt.Println("Inside Recover: ", r)
        }

    }()
    for try := 1 ; try <= i ; try++{
        if (i == 3){
            panic("Panic")
        }
        fmt.Printf("i: %d try: %d\n", i , try)
    }
}

func main(){

    for i := 1 ; i < 5 ; i++{
        test(i)
    }
}
package main

import (
    "errors"
    "fmt"
)

func test(i int) error {
    if i == 3 {
        return errors.New("Panic")
    }
    return nil
}

func retryWrapper(i, try int) {
    err := test(i)
    fmt.Printf("i: %d try: %d\n", i, try)

    if err != nil && try < 5 {
        retryWrapper(i, try+1)
    }
}

func main() {
    for i := 1; i < 5; i++ {
        retryWrapper(i, 1)
    }
}
func test(i int) (err error) {
    defer func() {
        if r := recover(); r != nil {
            err = errors.New(r.(string))
        }
    }()
    if i == 3 {
        panic("Panic")
    }
    return
}