Найти - Пользователи
Полная версия: Custom exception, не ловится
Начало » Python для экспертов » Custom exception, не ловится
1
race1
Привет.

Есть один главный модуль, и есть другой неглавный, который динамически загружается из главного. В главном модуле объявлено моё исключение, которое может быть вызвано из неглавного модуля. Пролема в том, что это исключение, вызванное в неглавном модуле, не ловится в главном. Вот код:

main.py
class MyException(Exception):
pass

m = __import__('module')
try:
m.func()
except MyException:
print('ops')
module.py
from main import MyException
def func():
raise MyException
Вместо ops в консоли программа упадёт, отобразив стандартный стэк-трейс. И скажет, что произошло исключение main.MyException. Если же сказать raise MyException в главном модуле, оно перехватится.

Вот, почему так?

Спасибо.
Ed
race1
Вот, почему так?
У вас по виду циклический импорт. Из main.py импортируется module, а в module.py импортируется нечто из main.

У меня вообще ваш пример падает вот так:
Traceback (most recent call last):
File "main.py", line 4, in <module>
m = __import__('module')
File "/home/ed/tmp/module.py", line 1, in <module>
from main.py import MyException
File "/home/ed/tmp/main.py", line 6, in <module>
m.func()
race1
Кажется там в коде у меня ошибка, надо не from main.py import, а from main import…

Пусть даже и циклический, Питон же с ними справляет неплохо. Может тут что-то, свзанное с __import__?..
Ed
Питону по-моему без разницы что там main.py или main. Падает так же. И точно так же падает при замене m = __import__(“module”) на import module as m
Ed
Вот, нашел статейку в тему: http://effbot.org/zone/import-confusion.htm
Рекомендую ознакомиться.
race1
Спасибо за статью :)

Вынес своё исключение в отдельный модуль, как и ожидалось, начало работать. Теперь моё исключение это “global_module.MyException”.

Т.е. изначальная проблема в том, что Питон почему-то считает класс К, объявленный в этом модуле, и класс К из этого модуля, но импортированный из другого модуля, двумя разными классами?
Ed
Изначальная проблема в том, что у вас циклический импорт.
Кстати, вы могли перенести свое исключение в module - тоже бы сработало, поскольку цикл бы исчез.
race1
Ага, я забыл что сначала главный модуль импортируется как __main__ (т.к. он запускается из командной строки), а потом он импортируется заново из неглавного модуля как main.

Мда, к некоторым особенностям Питона нужно перестраивать мышление… :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB