1

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

我正在尝试使用 try/except 功能,但它似乎不起作用。对于失败的 pdf,异常有效。但是,对于转换工作的 pdf,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 转换工作时,为什么两个块都在执行?而且,我怎样才能防止这种情况发生?谢谢!

4

1 回答 1

1

您可以做的一件事是,只有在没有引发异常的情况下,您才能使用elseof 子句来执行代码: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引发异常,则该子句不会处理它。elseexcept

正如其他人所说,单独使用except是不好的做法。您遇到的异常很可能是试图告诉您一些有用的信息,说明您的程序出错的原因,但是通过使用“裸” except,您将手指伸入耳朵并说“啦啦啦听不见你” Python 试图帮助你。

通常,仅处理您期望的异常是一种很好的做法。如果您知道SomePDFException如果出现问题,您的 PDF 库会引发,最好写

    except SomePDFException as e:

代替

    except:

但是,如果您不知道类型,则可以通过以下方式捕获大多数1异常:

    except Exception as e:
        print "Got exception of type %s:" % type(e)
        print e

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

1有一些例外不继承自Exception,即SystemExit,KeyboardInterruptGeneratorExit(文档:Python 2 , Python 3)。如果您得到其中之一,我会感到惊讶,我希望您使用的 PDF 库遵循 Python 指南,通过从而Exception不是BaseException.

于 2013-10-20T09:28:10.577 回答