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 шт):
Просто добавить 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')
Ваша ошибка может быть представлена таким примером:
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
. Но это не рекомендуемая практика. Специфические исключения лучше. Обобщённое исключение можно обработать последним, после остальных исключений, если очень хочется.