Короче говоря, я использую платный сервис convertapi.com для преобразования PDF-файлов в текст для проверки.
Если converttapi возвращает ответ HTTP 500 на запрос преобразования (и я знаю, что это происходит благодаря самый превосходный HTTP Toolkit v0.1.17) мой код python падает, несмотря на уже установленный блок try: / exception:
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, которое, если я отправляю запрос на преобразование , converttapi отвечает '500 Internal Service Error', и это тело ответа:
{
"Code": 5003,
"Message": "File is password protected."
}
Объекту 'result' выше должен быть присвоен этот словарь --- но он никогда не делает его.
Трассировка от исключения, которое я получаю, начинается с этого:
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 проходил через «запросы». Я довольно новичок в этом и все еще учусь.
Трассировка, похоже, ясно указывает на то, что «запросы» вызывают исключение - и если вы посмотрите на код ... / запросы / 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)
Изучив исключения, кажется, что если исключение вызывается с помощью инструкции 'поднимать' ... нет ли его ловушки с 'исключением'? Потому что это, кажется, то, что происходит. Мой код отправляет запрос на преобразование в блоке try: / кроме: специально для перехвата исключений, чтобы код (работающий на сервере, поддерживающем веб-сайт) не ломался и не предоставлял пользователю (в данном случае) светящееся сообщение:
A server error occurred. Please contact the administrator.
Наконец, мой вопрос ... могу ли я зафиксировать исключение, намеренно вызванное другим битом кода python? Потому что то, что у меня на месте, НЕ работает.
Я даже пытался вложить весь блок try: / exception: в рамках блока ДРУГОЙ попытки: / исключением: блок, но без изменений в результате .
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)
Да, я уверен, что это плотно, но я пытаюсь все, что я могу придумать.
Я не думаю, что этот вопрос конкретно c для Convertapi или запросы - я думаю, что речь идет об обработке исключений, в частности, как обрабатывать эту конкретную ситуацию.