В моем коде python как отловить исключение HTTP 500, вызванное модулем импортированных запросов? - PullRequest
0 голосов
/ 25 января 2020

Короче говоря, я использую платный сервис 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 или запросы - я думаю, что речь идет об обработке исключений, в частности, как обрабатывать эту конкретную ситуацию.

1 Ответ

0 голосов
/ 28 января 2020

Вы должны ожидать convertapi.exceptions.ApiError вместо Exception:

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