简而言之,我正在使用付费的 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 - 我认为这是关于异常处理,特别是如何处理这种特殊情况。