2013-07-10 44 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.majorminor以确保它至少也是3.2

希望更好的东西上来了......