web-dev-qa-db-fra.com

Quittez en douceur si le fichier n'existe pas

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.

21
Jakub Zaverka

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.

16
Hubro

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
2
Lorcan O'Neill