2017-06-12 4 views
0

Lors de la gestion des erreurs qui surviennent lors de la création d'un fichier existant ou de l'utilisation d'un fichier qui n'existe pas, les OSError s ont une sous-classe (FileExistsError, FileNotFoundError). Je ne pouvais pas trouver cette sous-classe pour le cas spécial lorsque le nom de fichier est trop long.Comment gérer OSError: [Errno 36] Nom de fichier trop long

Le message d'erreur est exacte:

OSError: [Errno 36] File name too long: 'filename' 

Je voudrais attraper le OSError qui se produit lorsque le nom de fichier est trop long, mais seulement quand le nom du fichier est trop long. Je fais pas voulez attraper d'autres OSError s qui pourraient se produire. Y a-t-il un moyen d'y parvenir? Je sais que je pourrais vérifier le nom de fichier sur une longueur mais la longueur maximale du nom de fichier varie trop en fonction de l'OS et du système de fichiers et je ne vois pas une solution "propre" de cette façon.

+0

Possible duplication de [exception Python IOError lors de la création d'un fichier long] (https://stackoverflow.com/questions/4677234/python-ioerror-exception-when-creating-a-long-file) – NuclearPeon

+0

@NuclearPeon: Non C'est spécifique à Windows et les réponses ne répondent pas à cette question. J'ai précisé cela dans la question. –

+0

Vous pouvez essayer d'obtenir le chemin d'accès au nom de fichier maximal, bien qu'il n'y ait aucun moyen sûr de le faire. Cochez ce lien: https://code.activestate.com/lists/python-list/210662/ - vérifiez la longueur du nom de fichier et notifiez l'utilisateur s'il est trop long. Sinon, un essai/except est votre meilleur pari comme déjà énuméré. – NuclearPeon

Répondre

3

Vérifiez simplement l'attribut errno de l'exception interceptée.

try: 
    do_something() 
except OSError as exc: 
    if exc.errno == 36: 
     handle_filename_too_long() 
    else: 
     raise # re-raise previously caught exception 

Pour faciliter la lecture, vous pouvez envisager d'utiliser constante appropriée de errno built-in module au lieu de constante hardcoded.

+0

Les grands esprits se ressemblent et publient ensemble! – pstatix

+0

Mais ensuite j'attrape aussi les autres 'OSError's que je ne veux pas particulièrement attraper! –

+0

@Max: L'augmentation prend soin de cela. Voir l'édition. – zondo

1

Vous pouvez spécifier à quel point vous voulez attraper une erreur spécifique, comme errno.ENAMETOOLONG:

spécifique à votre question ...

try: 
    # try stuff 
except OSError as oserr: 
    if oserr.errno != errno.ENAMETOOLONG: 
     # ignore 
    else: 
     # caught...now what? 

spécifique à vos commentaires ...

try: 
    # try stuff 
except Exception as err: 
    # get the name attribute from the exception class 
    errname = type(err).__name__ 
    # get the errno attribute from the exception class 
    errnum = err.errno 
    if (errname == 'OSError') and (errnum == errno.ENAMETOOLONG): 
     # handle specific to OSError [Errno 36] 
    else if (errname == 'ExceptionNameHere' and ...: 
     # handle specific to blah blah blah 
    . 
    . 
    . 
    else: 
     raise # if you want to re-raise; otherwise code your ignore 

Ceci va récupérer toutes les exceptions provoquées par des erreurs dans try. Ensuite, il vérifie si le __name__ correspond à une exception spécifique et à toutes les conditions supplémentaires que vous souhaitez spécifier.

Vous devriez savoir qu'il n'y a pas moyen de contourner le except si une erreur est rencontrée sauf si vous spécifiez une exception concrète.

+0

Mais j'attrape aussi les autres 'OSError's que je ne veux pas particulièrement attraper! –

+0

@MaxMatti Pour "attraper" et erreur, vous devez "gérer". Le 'if/else' définit le conditionnel que' if' l'exception 'errno' n'est pas égal à ('! = '), Vous écrivez du code pour l'ignorer (cependant vous choisissez de le faire); 'else' vous avez" attrapé "la bonne exception ... maintenant" gérer ". – pstatix

+0

Je ne veux pas l'ignorer! Je ne veux pas l'attraper. Je l'ai dit dans ma question: "Je ne veux pas attraper d'autres OSError qui pourraient se produire." Y a-t-il un moyen d'y parvenir? " S'il y a moyen de laisser se propager l'erreur précédente si 'errno' n'est pas égal à' errno.ENAMETOOLONG', ajoutez-le à votre réponse. Mais actuellement, je ne vois pas comment vous prévoyez d'y parvenir. –