try/except python. ошибка During handling of the above exception, another exception occurred:

Есть функция main() внутри которой сидит бесконечный цикл взаимодействующий с сервером. Написал блок try/except, но стало вылазить такое. During handling of the above exception, another exception occurred: и The above exception was the direct cause of the following exception:. Трейсбек ниже. Ошибки которые выскакивают в коде ниже. Подскажите плз, как для такого должна выглядеть ветка исключений.

if __name__ == "__main__":

    try:
        main()

    except httpcore.RemoteProtocolError:
        print('Ошибка, перезапуск')
    except httpcore.ReadTimeout:
        print('Ошибка, перезапуск')
    except NameError:
        print('Ошибка, перезапуск')
    except httpx.RemoteProtocolError:
        print('Ошибка, перезапуск')

Подскажите люди добрый в каком направлении мне копать или что делать, буду благодарен.

введите сюда описание изображения


Ответы (2 шт):

Автор решения: IvanProkshin

Просто добавить except Exception:?

if __name__ == "__main__":

    try:
        main()

    except httpcore.RemoteProtocolError:
        print('Ошибка, перезапуск')
    except httpcore.ReadTimeout:
        print('Ошибка, перезапуск')
    except NameError:
        print('Ошибка, перезапуск')
    except httpx.RemoteProtocolError:
        print('Ошибка, перезапуск')
    except Exception:
        print("Ошибка, перезапуск")

А вообще, судя по ошибке, лучше сделать так:

if __name__ == "__main__":

    try:
        main()

    except Exception as e:
        print(f'Ошибка, перезапуск\n\tОшибка: {e}\n')
→ Ссылка
Автор решения: CrazyElf

Ваша ошибка может быть представлена таким примером:

try:
    x = 1/0
except something:
    print('Ошибка!')

Вывод:

ZeroDivisionError                         Traceback (most recent call last)
Cell In[2], line 2
      1 try:
----> 2     x = 1/0
      3 except something:

ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

NameError                                 Traceback (most recent call last)
Cell In[2], line 3
      1 try:
      2     x = 1/0
----> 3 except something:
      4     print('Ошибка!')

NameError: name 'something' is not defined

Внимание на последнюю строку трейса. То, что написано после except Питон не знает как разрешить и выбрасывает новое исключение.

Конкретно в вашем случае обратите внимание на последнюю строку на скриншоте. Питон у вас не знает, что такое httpcore, вам его нужно откуда-то импортировать.

Причём, эта ошибка не проявляется, пока не произойдёт исключение. Если вернуться к моему примеру, то вот такой код успешно отработает без ошибок, хотя Питон по-прежнему не знает, что такое something:

try:
    x = 1
except something:
    print('Ошибка!')

Кстати, если вы хотите сделать одинаковую реакцию на несколько разных типов исключений, их можно объединить в кортеж и записать обработку исключения компактнее:

    except (httpcore.RemoteProtocolError, 
            httpcore.ReadTimeout,
            NameError, 
            httpx.RemoteProtocolError):
        print('Ошибка, перезапуск')

Если же вам вообще не важно какое именно выброшено исключение, реакция должна быть одинаковая на любое, тогда можно не писать специфические исключения и обрабатывать обобщённое Exception. Но это не рекомендуемая практика. Специфические исключения лучше. Обобщённое исключение можно обработать последним, после остальных исключений, если очень хочется.

→ Ссылка