Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 5, 2009 11:25:56

race1
От:
Зарегистрирован: 2009-10-29
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Привет.

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

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 в главном модуле, оно перехватится.

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

Спасибо.



Отредактировано (Ноя. 5, 2009 12:31:20)

Офлайн

#2 Ноя. 5, 2009 12:20:21

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Custom exception, не ловится

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()



Офлайн

#3 Ноя. 5, 2009 12:31:02

race1
От:
Зарегистрирован: 2009-10-29
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Кажется там в коде у меня ошибка, надо не from main.py import, а from main import…

Пусть даже и циклический, Питон же с ними справляет неплохо. Может тут что-то, свзанное с __import__?..



Офлайн

#4 Ноя. 5, 2009 13:41:42

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Питону по-моему без разницы что там main.py или main. Падает так же. И точно так же падает при замене m = __import__(“module”) на import module as m



Офлайн

#5 Ноя. 5, 2009 13:45:38

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Вот, нашел статейку в тему: http://effbot.org/zone/import-confusion.htm
Рекомендую ознакомиться.



Офлайн

#6 Ноя. 5, 2009 16:10:36

race1
От:
Зарегистрирован: 2009-10-29
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Спасибо за статью :)

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

Т.е. изначальная проблема в том, что Питон почему-то считает класс К, объявленный в этом модуле, и класс К из этого модуля, но импортированный из другого модуля, двумя разными классами?



Офлайн

#7 Ноя. 5, 2009 16:23:50

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Изначальная проблема в том, что у вас циклический импорт.
Кстати, вы могли перенести свое исключение в module - тоже бы сработало, поскольку цикл бы исчез.



Офлайн

#8 Ноя. 5, 2009 17:18:52

race1
От:
Зарегистрирован: 2009-10-29
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Custom exception, не ловится

Ага, я забыл что сначала главный модуль импортируется как __main__ (т.к. он запускается из командной строки), а потом он импортируется заново из неглавного модуля как main.

Мда, к некоторым особенностям Питона нужно перестраивать мышление… :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version