8

The following line:

except (IOError, PermissionError, FileNotFoundError) as e:

Gives the following error message when I run it with python 2.75:

NameError: global name 'PermissionError' is not defined

But everything runs fine with python 3.3.

Thoughts/suggestions?

4

2 回答 2

14

Python 2.7中没有PermissionError,它是在 Python 3.3 流中以PEP 3151引入的。有关 2.7 例外的列表,请参见此处

PEP 3151 试图清理 OS 和 I/O 相关异常的异常层次结构。

我相信,在那之前,等价的应该是 catchOSError和 check errnofor EPERM,或者IOErrorand check errnofor EACCES

您可以随时检查您是否在 Python 3.3 或更高版本下运行,如果不是,则创建您自己的 PermissionError。当然,这永远不会被抛出,因此您还需要抓住上面显示的两种可能性。

于 2013-08-13T02:03:09.077 回答
8

这为我解决了 python 2.75 和 3.31 的问题:

from errno import EACCES, EPERM, ENOENT

def print_error_message(e, file_name):
    #PermissionError
    if e.errno==EPERM or e.errno==EACCES:
        print("PermissionError error({0}): {1} for:\n{2}".format(e.errno, e.strerror, file_name))
    #FileNotFoundError
    elif e.errno==ENOENT:
        print("FileNotFoundError error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
    elif IOError:
        print("I/O error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))
    elif OSError:
        print("OS error({0}): {1} as:\n{2}".format(e.errno, e.strerror, file_name))

try:
...
except (IOError, OSError) as e:
    print_error_message(e,full_name)
    sys.exit()
except:
    print('Unexpected error:', sys.exc_info()[0])
    sys.exit()

欢迎提出想法/评论/建议。

于 2013-08-13T03:40:43.950 回答