Python:尝试/异常(exception)的问题

标签 python try-except

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

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

这是我的代码:

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 转换工作时,为什么两个 block 都被执行?而且,我怎样才能防止这种情况发生呢?谢谢!

最佳答案

您可以做的一件事是,您可以使用 try ... except ...else 子句,仅在没有引发异常的情况下执行代码:

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()

仅当 try block 中的代码完成且未引发异常时,才会执行 else block 中的代码。如果 else block 中引发异常, except 子句不会处理它。

正如其他人所说,单独使用 except 是不好的做法。你得到的异常很可能试图告诉你一些关于程序出错原因的有用信息,但是通过使用“裸”except,你就会 Handlebars 指放在耳朵里说“la”啦啦听不到你说话',Python 试图帮助你。

通常,最好只处理您期望的异常。如果您知道您的 PDF 库在出现问题时会引发 SomePDFException,那么最好编写

    except SomePDFException as e:

而不是

    except:

但是,如果您不知道类型,则可以使用以下方法捕获大多数1个异常:

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

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

1有一些异常不是从 Exception 继承的,即 SystemExitKeyboardInterruptGeneratorExit (文档: Python 2Python 3 )。如果您得到其中之一,我会感到惊讶,并且我希望您使用的 PDF 库遵循 Python 指南,从 Exception 而不是 BaseException 派生异常。

关于Python:尝试/异常(exception)的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473397/

相关文章:

python - 在嵌套 for 循环中使用 try- except

python - Python 中的异常处理(Try...Except)

python - 在终止 python 程序时做一些事情

Python 文档对 finally 中的 return 有误导性的解释

python - 位置权限弹出窗口

python - 在 ubuntu 14.04 上安装 graph-tool 时配置错误

python - tensorflow 安装正确,但在导入 tensorflow 为 tf 时出现错误 "ImportError: No module named ' _pywrap_tensorflow_internal'

python - 如何使用 sqlalchemy 枚举解决 mypy 错误?

python - 如何列出静态链接的 python 版本中可用的所有 openssl 密码?

Python:从具有不同类型变量的文件中读取行