2017-07-20 5 views
0

In Go, mit einem panic() können Sie defer und recover() zu prevent an app from exiting verwenden und Code weiter ausführen.golang - App von Beenden verhindern

Allerdings versuche ich zu verhindern, dass meine App beendet wird, wenn ich eine dial tcp 192.168.1.1:830: getsockopt: connection refused bekomme. Die Anwendung Exits mit einem Statuscode von 1. Es ist technisch kein Fehler, daher kann ich den Fehler nicht abfangen. Das externe Paket, das ich verwende, um die TCP-Wählfunktion auszuführen, bewirkt, dass die Anwendung beendet wird, wenn diese Bedingung eintritt. (In diesem Fall liegt das daran, dass der Port blockiert ist.)

Wie kann ich den Exit von einem anderen Paket wiederherstellen und mit meiner Anwendung fortfahren? Nehmen Sie die unten als Beispiel:

func makeRequest(target string) { 
    // Exits with status code 1, if connection refused 
    res, err := request.NewSession(target) 
} 
+2

Ist es in Panik geraten oder beenden? Wenn das andere Paket 'os.Exit' aufruft, können Sie nicht viel tun (außer vielleicht dieses Paket nicht verwenden: /). Welches Paket verursacht das Problem? – yazgazan

+1

Wenn ein Bibliothekspaket "os.Exit" aufruft, * verwende dieses Paket nicht *. Das ist unentschuldbar schlecht für ein Bibliothekspaket. – Adrian

+1

Es ist definitiv ein Ausgang und keine Panik, ich bekomme 'Exit Status 1' in stdout. Das Paket ist "https: // github.com/Juniper/go-netconf", aber es verwendet 'golang.org/x/crypto/ssh', um die Anrufe zu tätigen. – Devin

Antwort

1

Leider nein, können Sie sich nicht erholen von einem Aufruf os.Exit(). Die Dokumentation besagt, dass es sofort beendet wird und nicht einmal unterschiedliche Funktionen aufgerufen werden. Ich empfehle, ein Paket nicht zu verwenden, wenn es einen Ausgang darin hat, weil das ein ziemlich schlechtes Design ist.

Verwandte Themen