7

在处理尝试创建现有文件或尝试使用不存在的文件时发生的错误时,OSError抛出的 s 具有子类 ( FileExistsError, FileNotFoundError)。当文件名太长时,我找不到特殊情况的子类。

确切的错误信息是:

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

我想捕捉当文件名太长时发生的 OSError,但只有当文件名太长时才会发生。我不想捕捉其他OSError可能发生的 s。有没有办法做到这一点?

编辑:我知道我可以根据长度检查文件名,但最大文件名长度因操作系统和文件系统而异,而且我看不到“干净”的解决方案。

4

2 回答 2

13

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

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

为了便于阅读,您可以考虑使用errno内置模块中的适当常量而不是硬编码常量。

于 2017-06-12T18:23:41.703 回答
6

您可以指定如何捕获特定错误,例如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

这将抓取所有由try. 然后它检查是否__name__匹配任何特定异常以及您要指定的任何附加条件。

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

于 2017-06-12T18:25:07.223 回答