2013-07-10 3 views
3

Я хотел бы знать, как обрабатывать различные исключения, имеющие один и тот же «тип». Я пытаюсь использовать код, чтобы сделать каталог:Обработка исключений с разными кодами ошибок

os.mkdir(target_dir_name) 

И я знаю, что это может потерпеть неудачу по различным причинам, например, если каталог уже существует:

OSError: [Errno 17] File exists: 

или если есть не имеет прав для создания новой реж:

OSError: [Errno 13] Permission denied: 

Я хотел бы, чтобы адаптировать свои сообщения об ошибках конкретной причины отказа, так что я придумал следующий код:

try: 
    os.mkdir(target_dir_name) 
except OSError as e: 
    if e.errno == 17: 
    print "Warning: Directory %s already exists, executing a rebuild" % (target_dir_name) 
    elif e.errno == 13: 
    sys.exit("Error: Directory "+target_dir_name+" cannot be created incorrect permissions") 

, но я хотел бы сделать что-то немного менее жестко. Есть ли способ Pythonic, который я мог бы обновить мои проверки на отказ?

+0

В Python 3.3, там ошибки разделилось на отдельные типы: http://docs.python.org/3/whatsnew/3.3.html#pep-3151- reworking-the-os-and-io-exception-hierarchy – delnan

+0

Я еще не нашел элегантного решения, так как многие из этих исключений и типов ошибок настолько специфичны с их атрибутами. Поэтому обычно в этом случае я обычно делаю то, что предлагает http://stackoverflow.com/a/16268642/158111, - оберните определенную обработку ошибок в функцию и избегайте повторного жесткого кодирования. – woozyking

+0

@ delnan - Спасибо за ввод. Это будет распределенный скрипт, когда я покончу с этим, и я стараюсь не привязываться к одной версии Python, если я могу помочь. Я не могу гарантировать, что все будут работать, но я решил, что 2.7.3 будет довольно безопасным (поскольку это соответствует стандарту в последней стабильной версии Ubuntu). – Mike

ответ

0

Единственная информация, которую я нашел ... что я думаю, мой лучший ответ:

С errno module я могу по крайней мере, переписать мой текущий код, как:

import errno 
#... 
except OSError as e: 
    if e.errno == errno.EEXIST: 
    print "Warning: Directory %s already exists, e..." 
    elif e.errno == errno.EACCESS: 
    sys.exit("Error: Directory "+target_dir_name+"..." 

Если я обновить python 3.2 есть гораздо лучше:

except FileExistsError: 
    print ("Warning: Directory %s already exists, e...") 
except PermissionError: 
    sys.exit("Error: Directory "+target_dir_name+"...") 

Кажется, я мог бы сделать что-то фантазии с помощью sys.version_info.major и minor, чтобы убедиться, что это не менее 3.2.

Надеется, что-то лучше придумает ...

Смежные вопросы