名称错误:全局名称'PermissionError'未定义(Python 2.x)

9
以下是需要翻译的内容:

以下是一行示例:

except (IOError, PermissionError, FileNotFoundError) as e:

在使用Python 2.75运行时,会出现以下错误信息:
NameError: global name 'PermissionError' is not defined

但是使用Python 3.3一切都运行良好。

有什么想法/建议吗?

2个回答

16

在Python 2.7中没有PermissionError,它是在Python 3.3流中通过PEP 3151引入的。有关2.7异常列表,请参见此处

PEP 3151旨在清理与操作系统和I/O相关的异常层次结构。

我认为在此之前,相当于捕获OSError并检查errno是否为EPERM,或者捕获IOError并检查errno是否为EACCES

您始终可以检查是否在运行Python 3.3或更高版本,如果不是,则创建自己的PermissionError。当然,它永远不会被抛出,因此您还需要捕获上述两个可能性。


我需要这段代码在2.7和3.3版本的Windows和Unix上都能运行。有没有什么办法可以使代码适用于两个版本呢?例如:<br> try: input = raw_input <br> except NameError: pass - ofer.sheffer
我稍微调整了一下,当我将except行更改为'except (IOError, OSError) as e:'时,在两个Python版本中都可以正常工作。必须在except处理内部进行自己的层次结构,以便在两个Python版本上显示相同的消息 - 如果您有关于如何以另一种方式实现此操作(即如何执行第二个建议)的想法,我将非常感激提供代码示例。 - ofer.sheffer
1
@ofer,最好还是交给那些比我更深入思考的人来处理:可以看一下http://python3porting.com/toc.html。里面有很多关于使用`sys.version`进行检测的内容,即使您不想使用该文档中提倡的工具,也可以从中获得很多帮助。 - paxdiablo

9

对于我来说,这解决了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()

欢迎分享您的想法/评论/建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接