J'ai le script suivant dans Python 3.2.3:
try:
file = open('file.txt', 'r')
except IOError:
print('There was an error opening the file!')
sys.exit()
#more code that is relevant only if the file exists
Comment puis-je quitter gracieusement, si le fichier n'existe pas (ou s'il y a simplement une erreur en l'ouvrant)?
Je peux utiliser exit()
, mais cela ouvre un panneau de dialogue me demandant si je veux tuer l'application.
Je peux utiliser sys.exit()
, mais cela déclenche une exception SystemExit qui ne semble pas très bien en sortie. Je reçois
Traceback (most recent call last):
File "file", line 19, in <module>
sys.exit() SystemExit
Je peux utiliser os.exit()
, mais cela tue le Python au niveau C, sans aucun nettoyage que je puisse effectuer.
Je peux utiliser une variable booléenne et encapsuler tout le code suivant dans if ... mais c'est moche, et ce n'est pas la seule vérification que j'effectue. J'aurais donc voulu six ifs imbriqués ...
Je veux juste imprimer le message "Il y avait une erreur ..." et quitter. Je travaille à IDLE.
C'est une façon très gracieuse de le faire. Le traçage SystemExit ne sera pas imprimé en dehors de IDLE. Vous pouvez éventuellement utiliser sys.exit(1)
pour indiquer au shell que le script s'est terminé avec une erreur.
Vous pouvez également le faire dans votre fonction "principale" et utiliser return
pour terminer l'application:
def main():
try:
file = open('file.txt', 'r')
except IOError:
print('There was an error opening the file!')
return
# More code...
if __name__ == '__main__':
main()
Ici, le code d'exécution principal de l'application est encapsulé dans une seule fonction appelée "main", puis exécuté niquement si le script est exécuté directement par l'interpréteur Python, ou en d'autres termes, si le script est pas importé par un autre script (le __name__
la variable est définie sur "__main__" si le script est exécuté directement à partir de la ligne de commande. Sinon, il sera défini sur le nom du module.)
Cela a l'avantage de rassembler toutes les logiques d'exécution de script dans une seule fonction, rendant votre script plus propre, et vous permet de quitter proprement votre script en utilisant l'instruction return
, comme dans la plupart des langages compilés.
L'utilisation de sys.exit () est très bien. Si vous êtes préoccupé par la sortie, vous pouvez toujours ajouter un bloc try/except supplémentaire dans votre section de gestion des erreurs pour intercepter le SystemExit et l'empêcher d'être dirigé vers la sortie de la console.
try:
file = open('file.txt', 'r')
except IOError:
try:
print('There was an error opening the file!')
sys.exit()
except SystemExit:
#some code here that won't impact on anything