NameError:未定义全局名称'PermissionError'(python 2.x)

ofe*_*fer 5 permissions python-2.x nameerror python-3.x

以下行:

except (IOError, PermissionError, FileNotFoundError) as e:
Run Code Online (Sandbox Code Playgroud)

使用python 2.75运行它时给出以下错误消息:

NameError: global name 'PermissionError' is not defined
Run Code Online (Sandbox Code Playgroud)

但是python 3.3的一切运行良好.

思考/建议吗?

pax*_*blo 10

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

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

我相信,在此之前,等效本来赶上OSError和检查errnoEPERM,或IOError检查errnoEACCES.

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


ofe*_*fer 5

这为我解决了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()
Run Code Online (Sandbox Code Playgroud)

欢迎提出想法/意见/建议.