2016-07-27 15 views

Antwort

1

Sie sollten os.Exit verwenden.

Beenden bewirkt, dass das aktuelle Programm mit dem angegebenen Statuscode beendet wird. Herkömmlicherweise zeigt der Code Null Erfolg an, ein Fehler ungleich Null. Das Programm wird sofort beendet; Zurückgestellte Funktionen werden nicht ausgeführt.

package main 

import (
    "fmt" 
    "os" 
) 


func main() { 
    fmt.Println("Start") 
    os.Exit(1) 
    fmt.Println("End") 
} 

Auch können Sie panic verwenden, es ist auch die normale Ausführung zu stoppen, aber Fehler werfen, wenn die Ausführung zu stoppen.

Die integrierte Panikfunktion stoppt die normale Ausführung der aktuellen Goroutine. Wenn eine Funktion F Panik auslöst, stoppt die normale Ausführung von F sofort . Alle Funktionen, deren Ausführung durch F verzögert wurde, werden auf die übliche Weise ausgeführt, und dann kehrt F zu seinem Aufrufer zurück. Für den Aufrufer G, , verhält sich der Aufruf von F dann wie ein Aufruf zu panic, beendet Gs Ausführung und führt alle zurückgestellten Funktionen aus. Dies wird fortgesetzt, bis alle Funktionen in der Ausführungsgoroutine in umgekehrter Reihenfolge gestoppt wurden. An diesem Punkt wird das Programm beendet und die Fehlerbedingung ist gemeldet, einschließlich des Werts des Arguments in Panik. Diese Terminierungssequenz wird Panik genannt und kann durch die integrierte Funktion recover gesteuert werden.

package main 

import "fmt" 

func main() { 
    fmt.Println("Start") 
    panic("exit") 
    fmt.Println("End") 
} 
1

Sie können panic im HTTP-Handler verwenden. Der Server wird damit umgehen. Siehe Handler.

Wenn ServeHTTP in Panik gerät, nimmt der Server (der Aufrufer von ServeHTTP) an, dass der Effekt der Panik auf die aktive Anforderung isoliert wurde. Es stellt die Panik wieder her, protokolliert einen Stack-Trace zum Serverfehlerprotokoll und legt die Verbindung auf.

Die Funktion panic ist für die Situation reserviert, in der das Programm nicht fortgesetzt werden kann. Unfähigkeit, nur eine Anforderung zu bedienen, ist nicht dasselbe wie die Unfähigkeit, weiter zu arbeiten, daher würde ich den Fehler protokollieren, einen korrekten HTTP-Status setzen und return verwenden. Siehe Effective Go.

Die übliche Methode zum Melden eines Fehlers an einen Aufrufer besteht darin, einen Fehler als zusätzlichen Rückgabewert zurückzugeben. Die kanonische Read-Methode ist eine bekannte Instanz; Es gibt eine Byteanzahl und einen Fehler zurück. Was aber, wenn der Fehler nicht behoben werden kann? Manchmal kann das Programm einfach nicht fortgesetzt werden.

1

Der idiomatische Weg, um eine Funktion in Go zu brechen, ist panic() zu verwenden. Dies ist die Möglichkeit, die Ausführung eines Ereignisses zur Laufzeit zu stoppen. Wenn Sie die Panik wiederherstellen möchten, können Sie die integrierte Funktion recover() verwenden.

Panik Erklärung:

Panik ist eine eingebaute Funktion, die den normalen Ablauf der Steuerung stoppt und beginnt in Panik zu geraten. Wenn die Funktion F Panik aufruft, wird die Ausführung von F gestoppt, alle zurückgestellten Funktionen in F werden normal ausgeführt, und dann kehrt F an seinen Aufrufer zurück.

https://blog.golang.org/defer-panic-and-recover

Erklärung wiederherzustellen:

Wiederherstellen ist eine eingebaute Funktion, die Steuerung einer panischen goroutine wiedergewinnt. Recover ist nur in deferred-Funktionen nützlich. Während der normalen Ausführung wird ein Aufruf zum Wiederherstellen Null zurückgeben und keinen anderen Effekt haben. Wenn die aktuelle Goroutine in Panik ist, wird ein Aufruf zur Wiederherstellung den Wert erfassen, der an panic übergeben wurde, und die normale Ausführung fortsetzen.

https://blog.golang.org/defer-panic-and-recover

Und hier ist ein einfaches Beispiel:

package main 

import "fmt" 

func badCall() { 
    panic("Bad call happend!") 
} 

func test() { 
    defer func() { 
     if err := recover(); err != nil { 
      fmt.Printf("Panicking %s\n\r", err) 
     } 
    }() 

    badCall() 
    fmt.Println("This is never executed!!") 
} 

func main() { 
    fmt.Println("Start testing") 
    test() 
    fmt.Println("End testing") 
} 
1

Wenn Sie Sie können nicht einen Stack-Trace nach dem Verlassen des Programm drucken möchten, os.Exit verwenden. Sie können auch einen spezifischen Beendigungscode mit os.Exit festlegen.

Beispiel (https://play.golang.org/p/XhDkKMhtpm):

package main 

import (
    "fmt" 
    "os" 
) 

func foo() { 
    fmt.Println("bim") 
    os.Exit(1) 
    fmt.Println("baz") 
} 

func main() { 
    foo() 
    foo() 
} 

auch darüber im Klaren sein, dass os.Exit das Programm sofort beendet und keine latenten Funktionen ausführen, während panic() tut. Siehe https://play.golang.org/p/KjGFZzTrJ7 und https://play.golang.org/p/Q4iciT35kP.