Comment puis-je trier une erreur provenant d'une "condition de disque plein" de celle de "tentative d'écriture sur un système de fichiers en lecture seule" ? Je ne veux pas remplir mon disque dur pour le découvrir :) Ce que je veux, c'est savoir comment attraper chaque exception, afin que mon code puisse afficher un message à l'utilisateur lorsqu'il essaie d'écrire sur un système de fichiers en lecture seule et un autre message si l'utilisateur tente d'écrire un fichier sur un disque plein.
Réponses
Trop de publicités?Une fois que vous attrapez IOError
, par exemple avec une clause except IOError, e:
en Python 2.*, vous pouvez examiner e.errno
pour déterminer exactement de quel type d'erreur d'E/S il s'agissait (malheureusement d'une manière qui n'est pas nécessairement entièrement portable entre différents systèmes d'exploitation).
Voir le module errno dans la bibliothèque standard Python ; l'ouverture d'un fichier en écriture sur un système de fichiers en R/O (sur un OS sensé) devrait produire errno.EPERM
, errno.EACCES
ou mieux encore errno.EROFS
("système de fichiers en lecture seule"); si le système de fichiers est R/W mais qu'il n'y a plus d'espace vous devriez obtenir errno.ENOSPC
("plus d'espace disponible sur le périphérique"). Mais vous devrez expérimenter sur les OS qui vous intéressent (avec une petite clé USB en le remplissant devrait être facile ;-).
Il n'y a pas de moyen d'utiliser différentes clauses except
en fonction du errno -- de telles clauses doivent être distinguées par la classe des exceptions qu'elles attrapent, et non par les attributs de l'instance d'exception -- donc vous aurez besoin d'un if/else ou d'un autre type de dispatching au sein d'une seule clause except IOError, e:
.
Sur un système de fichiers en lecture seule, les fichiers eux-mêmes seront marqués comme en lecture seule. Toute tentative d'open
un fichier en lecture seule pour écriture (O_WRONLY
ou O_RDWR
) échouera. Sur les systèmes de type UNIX, errno EACCES
sera défini.
\>>> file('/etc/resolv.conf', 'a')
Traceback (most recent call last):
File "", line 1, in
IOError: \[Errno 13\] Permission denied: '/etc/resolv.conf'
En revanche, les tentatives d'write
dans un fichier complet peuvent entraîner ENOSPC
. Peut être critique; l'erreur peut être retardée jusqu'à fsync
ou close
.
\>>> file([/dev/full](http://en.wikipedia.org/wiki//dev/full), 'a').write('\\n')
close failed in file object destructor:
IOError: \[Errno 28\] No space left on device