Python:Try / Except的麻烦

时间:2013-10-20 02:51:27

标签: python try-except

我有一些代码可以打开并搜索一个充满pdfs的文件夹。我正在使用pdfminer进行pdf转换。但是,我的一些pdf不可读。我希望我的代码能够处理转换工作的那些pdf,并有效地跳过那些转换失败的pdf文件。

我正在尝试使用try / except功能,但它似乎不起作用。对于失败的pdf,异常有效。但是,对于转换有效的pdfs,执行try和exception块。

这是我的代码:

fileNum = 0
d = shelve.open('PyDocSearch.db')
for file in fileList:
    fileNum += 1
    z = []
    try:
        doc = convert_pdf(filePath + '/' + file)
        print 'Success:',file
        docWords = doc.split()
        x = Counter(docWords)
        y = x.most_common()
        for i,j in enumerate(y):
            if j[0] not in commonWords:
                z.append(j)
        d[file] = z
    except:
        doc = 'fail'
        print 'Fail:',file
        d[file] = doc
d.close()

当pdf转换工作时,为什么两个块都被执行?而且,我该如何防止这种情况发生?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以做的一件事是,只有在没有引发异常的情况下,您才可以使用else的{​​{1}}子句来执行代码:

try ... except ...

仅当fileNum = 0 d = shelve.open('PyDocSearch.db') for file in fileList: fileNum += 1 z = [] try: doc = convert_pdf(filePath + '/' + file) except: doc = 'fail' print 'Fail:',file d[file] = doc else: print 'Success:',file docWords = doc.split() x = Counter(docWords) y = x.most_common() for i,j in enumerate(y): if j[0] not in commonWords: z.append(j) d[file] = z d.close() 块中的代码完成而不引发异常时,才会执行else块中的代码。如果在try块中引发异常,则else子句处理它。

正如其他人所说,单独使用except是不好的做法。你得到的例外情况很可能是试图告诉你有关你的程序出错的原因,但是通过使用'裸'except,你会把手指放在耳朵里说'la la la can听到你的声音,Python试图帮助你。

通常,只处理您期望的异常是一种好习惯。如果您知道如果出现问题,您的PDF库会引发except,那么最好写一下

SomePDFException

而不是

    except SomePDFException as e:

但是,如果您不知道类型,则可以使用以下内容捕获大多数 1 例外:

    except:

然后告诉您引发的异常类型和消息。

1 有一些例外情况不会从 except Exception as e: print "Got exception of type %s:" % type(e) print e 继承,即ExceptionSystemExitKeyboardInterrupt(文档:{{ 3}},Python 2)。如果您正在获取其中一个,我会感到惊讶,我希望您使用的PDF库遵循Python指导,从GeneratorExit而不是Exception派生例外。