2016-07-08 12 views
2

Code Play Golang LinkWiederholen Sie die Methode mit dem gleichen Parameter, die es

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

Die Methode Panik und springt zum nächsten i Wert in Panik verursacht i mal ohne zu versuchen. Gibt es eine Möglichkeit, wie wir uns von der Panik erholen und den gleichen Wert von i erneut versuchen können, der Panik verursacht hat?

+2

Sie können 'i' nach' panic' übergeben, dies wird von 'recover' zurückgegeben. Am wahrscheinlichsten sollten Sie stattdessen Fehlerwerte verwenden. Panics in Go werden hauptsächlich für unerwartete Fehler verwendet, die nicht behoben werden können. – kostya

+0

@kostya: Ich stimme völlig mit Ihnen bei der Verwendung von Fehlerwerten überein. Mein Problem ist, dass einige Funktionen unvollständig sind, so dass Panik verwendet wird. Wir möchten nur sicherstellen, dass der Server nicht abstürzt und für die Verarbeitung der nächsten Anfragen zur Verfügung steht. –

+0

Sind Sie sicher, dass Sie Panik brauchen? Aus Ihrem Code scheint ein zweiter Fehlerparameter - der geizianische Weg - für diesen Fall besser geeignet zu sein. FYI panic/recover ist nicht das, was wir versuchen/fangen in anderen Sprachen. Fehler betreffen die Fehlerbehandlung in Go. Panics werden verwendet, wenn das Programm in Panik geraten sollte, wenn es keinen Zugriff auf Datenbank oder Dateisystem hat (also weiterarbeiten ist sinnlos) oder eine andere externe (C) lib nicht wie erwartet funktioniert. –

Antwort

1

Ich gehe davon aus, Sie wollten jede Funktion testen, die mit diesem Konstrukt fehlschlagen könnte, am besten ohne diese Funktion zu ändern. Hier meine Lösung. Hoffe, das ist, was Sie gesucht haben.

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

Dies funktioniert mit Funktionen, die einen Fehler zurück. Wenn Ihre Funktion gerät in Panik, werden Sie die Testfunktion mit einer Zurückstellungs ändern müssen/wie diese wieder her:

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 
} 

Hinweis: Wiederholungs bis 5 trys begrenzt ist eine Endlosschleife zu verhindern.

+0

Also schlagen Sie vor, dass ich in Defer Wiederherstellung Block manuell einen Fehler erstellen und zurückgeben sollte? –

+0

korrekt. Und darauf aufbauend rufe die Funktion wieder von außen auf. Wenn Sie versuchen, die Funktion im Defer-Block erneut aufzurufen, müssen Sie die Funktion mit zusätzlichen Parametern ändern, um z. B. zu wissen, wann Sie den Vorgang wiederholen müssen. – TehSphinX

Verwandte Themen