如何处理OSError:[Errno 36]文件名太长

时间:2017-06-12 18:19:27

标签: python python-3.x filenames long-filenames

当处理尝试创建现有文件或尝试使用不存在的文件时发生的错误时,被抛出的OSError有一个子类(FileExistsError,{{1 }})。

,当文件名太长时,我找不到特殊情况的子类。

确切的错误消息是:

FileNotFoundError

我想捕获文件名太长时发生的OSError,但仅当文件名太长时才会发生。我想要捕获可能发生的其他OSError: [Errno 36] File name too long: 'filename' 。有没有办法实现这个目标?

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

2 个答案:

答案 0 :(得分:5)

只需检查已捕获异常的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中的适当常量而不是硬编码常量。

答案 1 :(得分:2)

您可以指定捕获特定错误的方式,例如errno.ENAMETOOLONG

特定于您的问题......

if (!in_array($title, $checklist)) {
    $checklist[] = $title;
    $result[] = $item;
}

特定于您的评论......

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__没有问题,除非您具体说明具体异常。