Le script que j'écris devrait revenir à l'invite du shell avec un message utile si les données à traiter ne sont pas exactement correctes. L'utilisateur doit corriger les problèmes signalés jusqu'à ce que le script soit satisfait et ne quitte plus avec des messages d'erreur. Je développe le script avec TTD, donc j'écris un test pytest
avant d'écrire la fonction. Le most heavily up-voted answer here suggère que les scripts soient édités en appelant sys.exit
ou en soulevant SystemExit
.Terminer un script de ligne de commande Python avec des messages utiles, pythoniquement
La fonction:
passe ce test (où _non-text.png
est un fichier PNG, à savoir, non encodé en UTF-8):
def test_istext():
with pytest.raises(SystemExit):
istext('_non-text.png')
Cependant, le script continue de fonctionner, et les instructions placées après l'exécution du bloc try/except
. Je veux que le script se termine complètement à chaque fois pour que l'utilisateur puisse déboguer les données jusqu'à ce qu'elles soient correctes, et le script fera ce qu'il est censé faire (c'est-à-dire traiter un répertoire plein de texte UTF-8 fichiers, pas PNG, JPG, PPTX ... fichiers).
a également essayé:
qui suit passe également le test ci-dessus en soulevant une exception qui est une sous-classe de SystemExit
, mais il fait aussi quitter pas le script:
def istext(file_to_test):
class NotUTF8Error(SystemExit): pass
try:
open(file_to_test).read(512)
except UnicodeDecodeError:
raise NotUTF8Error('File {} must be UTF-8.'.format(file_to_test))
Hmm, je n'ai pas pu obtenir cet exemple pour fonctionner, même sans le message d'erreur. –
Après avoir déclaré la classe 'class NotUTF8Error (SystemExit): pass', et après' exception UnicodeDecodeError comme exception: ',' raise NotUTF8Error from exception' obtient un 'SyntaxError'. –
Peu importe - j'ai réussi à faire fonctionner cela, seulement maintenant le pytest échoue avec 'NameError: name 'NotUTF8Error' n'est pas défini'. –