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都会生成一条足够相似的消息,您可以查找一两个关键字