首页 > 解决方案 > 在我的 python 代码中,如何捕获导入的请求模块引发的 HTTP 500 异常?

问题描述

简而言之,我正在使用付费的 convertapi.com 服务将 PDF 文件转换为文本以供检查。

如果 convertapi 对转换请求返回 HTTP 500 响应(我知道这要归功于最优秀的 HTTP Toolkit v0.1.17),尽管 try: / except: 块已经到位,但我的 python 代码崩溃:

import requests
import convertapi
...
def convertPDFToText(
    inputFilename: str,
    outputFilename: str,
    noticeList: list
) -> [bool, str, int, list]:
    '''Returns
    bool    success = True
    str     outputFilePath
    int     conversionCost
    list    noticeList'''

    try:
        result = convertapi.convert('txt', {'File': inputFilename}, from_format='pdf')
    except Exception as ex:
        logger.error('Error! Unable to convert PDF file ' + inputFilename + ' to text.')
        logger.error('Failed with exception [%s]' % ex)
        return(False, ' ', 0, noticeList)

    if "code" in result.keys():
        logger.info(
            'Convertapi.convert returned code ' + str(result["code"]) + ' ' +
            result["message"])
        logger.info('Convertapi.convert returned code ' + str(result["code"]))
        return(False, ' ', 0, noticeList)

所以我有一个特定的 inputFilename,如果我发送转换请求,convertapi 会以“500 内部服务错误”和此响应正文进行响应:

{
  "Code": 5003,
  "Message": "File is password protected."
}

上面的对象“结果”应该分配给这个字典——但它永远不会成功。

我得到的异常的回溯从这个开始:

ts.models    INFO     Logging initiated.
ts.models    INFO     STARTING CODE EXECUTION
ts.models    INFO     preferences file read and stored
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/convertapi/client.py", line 46, in handle_response
    r.raise_for_status()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/requests/models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 500 Server Error: Internal Server Error for url: https://v2.convertapi.com/convert/pdf/to/txt?Secret=<I've deleted my secret key>

老实说,我不确定“请求”模块是如何参与其中的。我正在使用它,但我没有意识到/理解对 convertapi.com 的调用是通过“请求”传递的。我对此很陌生,仍在学习。

回溯似乎清楚地表明“请求”正在引发异常 - 如果您查看 .../requests/models.py 引用的代码,您确实会看到:

936        elif 500 <= self.status_code < 600:
937            http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url)
938
939        if http_error_msg:
940            raise HTTPError(http_error_msg, response=self)

研究了异常后,似乎如果使用“raise”指令引发异常......没有用“except”捕获它?因为这似乎就是正在发生的事情。我的代码在 try: / except: 块中发出转换请求,专门用于捕获异常,因此代码(在支持网站的服务器上运行)不会中断并为用户提供(在这种情况下)启发性消息:

A server error occurred.  Please contact the administrator.

最后,我的问题是......我可以捕获另一段 python 代码故意引发的异常吗?因为我现有的东西不起作用。

我什至尝试将整个 try: / except: 块嵌套在另一个 try: / except: 块中,但结果没有变化。

    try:
        try:
            result = convertapi.convert('txt', {'File': inputFilename}, from_format='pdf')
        except Exception as ex:
            logger.error('Error! Unable to convert PDF file ' + inputFilename + ' to text.')
            logger.error('Failed with exception [%s]' % ex)
            return(False, ' ', 0, noticeList)
    except:
        if "code" in result.keys():
            logger.info(
                'Convertapi.convert returned code ' + str(result["code"]) + ' ' +
                result["message"])
            logger.info('Convertapi.convert returned code ' + str(result["code"]))
        logger.error('Error! Unable to convert PDF file ' + inputFilename + ' to text.')
        logger.error('Failed with exception [%s]' % ex)
        return(False, ' ', 0, noticeList)

是的,我确信这很密集,但我正在尝试我能想到的一切。

我不认为这个问题是特定于 convertapi 或 requests - 我认为这是关于异常处理,特别是如何处理这种特殊情况。

标签: pythonexceptionpython-requestshttp-status-codesconvertapi

解决方案


您应该期望convertapi.exceptions.ApiError而不是Exception

try:
    result = convertapi.convert(...)
except convertapi.exceptions.ApiError as ex:
    logger.error('Failed with exception [%s]' % ex)        

推荐阅读