2017-06-12 461 views
0

当处理尝试创建现有文件时发生的错误或尝试使用不存在的文件时,抛出的OSError有一个子类( FileExistsErrorFileNotFoundError)。当文件名太长时,我找不到特殊情况下的子类。如何处理OSError:[Errno 36]文件名太长

确切的错误信息是:

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

我想赶在文件名过长时出现的OSERROR,但只有当文件名过长。我做不是想抓其他可能发生的OSError。有没有办法做到这一点?

编辑:我知道我可以根据长度检查文件名,但最大文件名长度根据操作系统和文件系统而变化太大,我没有看到这样的“干净”解决方案。

+0

[Python IOError异常,当创建一个长文件]可能重复(https://stackoverflow.com/questions/4677234/python-ioerror-exception-when-creating-a-long-file) – NuclearPeon

+0

@NuclearPeon:否这是Windows特有的,那里的答案不能回答这个问题。我在这个问题中指出了这一点。 –

+0

您可以尝试获取最大文件名路径,但没有办法做到这一点。检查此链接:https://code.activestate.com/lists/python-list/210662/ - 检查文件名的长度,并通知用户是否太长。否则,尝试/除了是你已经列出的最好的赌注。 – NuclearPeon

回答

3

只需检查errno捕获异常的属性。

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

为了提高可读性,你可以考虑使用适当的常量从errno built-in module而不是硬编码不变。

+0

伟大的思想思考和一起发布! – pstatix

+0

但是后来我也抓住了另外一个'OSError',我特别不想抓到! –

+0

@Max:加注会照顾到这一点。查看编辑。 – zondo

1

可以指定你是多么想赶上一个特定的错误,如errno.ENAMETOOLONG

具体到你的问题...

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

具体到您的意见...

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 

这将捕获由0中的错误引起的所有异常。然后它检查__name__是否与任何特定的异常以及您要指定的其他条件匹配。

如果遇到错误,除非您指定了具体的异常,否则您应该知道没有绕过except

+0

但是后来我也抓住了另一个'我特别不想抓到的OSError'! –

+0

@MaxMatti为了“捕捉”和错误,你必须“处理”它。 'if/else'设置条件,如果'例外'errno'属性不等于('!='),则你编写代码来忽略它(然而你选择这样做)。 'else'你已经“抓住”了正确的例外......现在“处理”它。 – pstatix

+0

我不想忽视它!我想不去捕捉它。我在我的问题中指出:“我不希望捕获可能发生的其他'OSError',是否有办法实现这一点?” 如果有一种方法可以让以前的错误进一步传播,如果'errno'不等于'errno.ENAMETOOLONG',请将其添加到您的答案。但目前我看不出你打算如何实现这一目标。 –

相关问题