2017-07-20 1 views
0

Dans Go, avec panic(), vous pouvez utiliser defer et recover() à prevent an app from exiting et continuer à exécuter le code.golang - empêcher l'application de quitter

Cependant, j'essaie d'empêcher mon application de se fermer lorsque j'obtiens un dial tcp 192.168.1.1:830: getsockopt: connection refused. L'application Quitte avec un code d'état de 1. Techniquement, ce n'est pas une erreur, donc je ne peux pas attraper l'erreur. Le package externe que j'utilise pour créer la commande tcp entraîne la sortie de l'application lorsque cette condition se produit. (Dans ce cas, c'est parce que le port est bloqué.)

Alors, comment puis-je récupérer la sortie d'un autre paquet et continuer avec mon application? Prenez l'exemple ci-dessous:

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

Panique-t-il ou disparaît-il? Si l'autre paquet appelle 'os.Exit', alors vous ne pouvez pas faire grand-chose (sauf peut-être n'utilisez pas ce paquet: /). Quel paquet cause le problème? – yazgazan

+1

Si un paquet de bibliothèque appelle 'os.Exit', * n'utilisez pas ce paquet *. C'est une pratique inexcusablement mauvaise pour un paquet de bibliothèque. – Adrian

+1

C'est définitivement une sortie et pas de panique, j'obtiens 'exit status 1' dans stdout. Le paquet est 'https: // github.com/Juniper/go-netconf' mais il utilise' golang.org/x/crypto/ssh' pour faire les appels. – Devin

Répondre

1

Malheureusement non, vous ne pouvez pas récupérer d'un appel à os.Exit(). La documentation dit qu'elle sort immédiatement, et même les fonctions différées ne sont pas appelées. Je recommande de ne pas utiliser un paquet s'il y a une sortie, car c'est un mauvais design.