使用导致其发生混乱的相同参数重试该方法

时间:2016-07-08 11:15:45

标签: go

Code Play Golang Link

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)
    }
}

该方法会发生恐慌并跳至下一个i值,而不会尝试i次。有没有一种方法可以让我们从恐慌中恢复并重新尝试导致恐慌的i的相同值?

1 个答案:

答案 0 :(得分:1)

我假设您想要测试任何可能因此构造失败的函数,最好不必更改该函数。我的解决方案。希望这是你想要的。

Go PlayGround

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)
    }
}

这适用于返回错误的函数。如果您的功能发生混乱,您需要更改延迟/恢复测试功能,如下所示:

Recover Sample

func test(i int) (err error) {
    defer func() {
        if r := recover(); r != nil {
            err = errors.New(r.(string))
        }
    }()
    if i == 3 {
        panic("Panic")
    }
    return
}

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