Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用try…except捕获特定异常_Python_Python 2.7 - Fatal编程技术网

Python 使用try…except捕获特定异常

Python 使用try…except捕获特定异常,python,python-2.7,Python,Python 2.7,我有一些代码可以重命名一大堆文件,并使用os.rename()将它们移动到一个新目录。它相当简单,没有什么浮华。它一直工作,直到我在批处理中有一些重叠,并且有重复的文件,这引发了一个WindowsError。因为代码以其他方式工作,所以我做了 try: os.rename(...) except WindowsError: print "Duplicate file {}".format(fileName) 这很好,只是它意味着所有的WindowsErrors都来自重复的文件。

我有一些代码可以重命名一大堆文件,并使用
os.rename()
将它们移动到一个新目录。它相当简单,没有什么浮华。它一直工作,直到我在批处理中有一些重叠,并且有重复的文件,这引发了一个
WindowsError
。因为代码以其他方式工作,所以我做了

try:
    os.rename(...)
except WindowsError:
    print "Duplicate file {}".format(fileName)
这很好,只是它意味着所有的
WindowsError
s都来自重复的文件。结果是,当我的脚本的另一个方面崩溃时,它基本上是无声地失败的

如何使用
try…except
仅捕获特定异常?如果不可能,存在哪些变通方法?

根据:

“该值将
winerror
值映射到相应的
errno.h
值。”

因此,您应该能够使用
errno
区分不同的Windows错误

例如:

try:
    fp = open("nother")
except IOError as e:
    print e.errno
    print e

我编写了一个上下文管理器,根据
errno
值抑制
OSError
。这里是上下文管理器,只是重写了一点以捕获
WinError

您的示例代码在错误发生时打印消息,但不会打印任何内容;它会静默地抑制异常

我没有测试这个,因为我手头没有Windows,但我测试了原始版本,这是一个微不足道的编辑。如果你对此有任何问题,请告诉我

。\uuuu exit\uuuu()
方法函数获取有关任何接收到的异常的信息,如果它返回
True
则异常被抑制;如果返回
False
,则异常将正常引发。因此,只有当类型匹配(这是一个
WinError
异常)且
.errno
属性与保存的
self.errno
值匹配时,才会抑制异常

class suppress_winerror(object):
    def __init__(self, errno):
        self.errno = errno

    def __enter__(self):
        return self

    def __exit__(self, e_type, e_val, e_tb):
        if e_type is not WinError:
            return False
        if e_val.errno != self.errno:
            return False
        return True
如何使用此功能的示例。我假设windows错误代码映射到“文件已存在”的
errno.EEXIST
,即
errno
代码。显然,如果我弄错了,你应该改为输入正确的错误代码

import errno

with suppress_winerror(errno.EEXIST):
    os.rename(old_fname, new_fname)

您可以尝试将WindowsError捕获为e:,然后查看
str(e)
,以及
dir(e)
@JoranBeasley,我想了想,但是与异常相关的字符串不是依赖于系统吗?错误消息的全文不能保证在所有系统上都是相同的,因此,如果我在搜索该文本中的一些错误描述,我怎么知道要搜索什么呢?我猜所有版本的windows都会生成一条足够相似的消息,您可以查找一两个关键字