Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2010 17:00:46

wonderfulll
От:
Зарегистрирован: 2009-01-30
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли поймайть исключение в родительском классе потока?

Есть родительский класс в нём запускаем поток. Можно ли в родительском классе поймать ошибку дочернего потока? Что-то наподобие ниже приведённого.

try:
self.thr = SomeThreadClass()
time.sleep(1)
self.thr.start()
except Exception, error:
print str(error)
class SomeThreadClass:
def run(self):
try:
some_action()
except Exception, error:
raise Exception('Some action failed')



Офлайн

#2 Фев. 11, 2010 18:31:03

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Можно ли поймайть исключение в родительском классе потока?

Практика показывает, что только сообщением через queue или pipe.



Офлайн

#3 Фев. 11, 2010 18:42:37

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Можно ли поймайть исключение в родительском классе потока?

а с родительским классом ничего не случится (не выпадет) если в дочернем вылетит except не прекрытый через try..except ?

Офлайн

#4 Фев. 11, 2010 18:51:59

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Можно ли поймайть исключение в родительском классе потока?

Обычно нет, дохнет только нитка.



Офлайн

#5 Фев. 14, 2010 17:59:22

wonderfulll
От:
Зарегистрирован: 2009-01-30
Сообщения: 72
Репутация: +  0  -
Профиль   Отправить e-mail  

Можно ли поймайть исключение в родительском классе потока?

Может кто ещё ссылочку подкинет на пример использования Queue для передачи исключений.



Офлайн

#6 Фев. 14, 2010 18:38:48

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

Можно ли поймайть исключение в родительском классе потока?

Ну так в чем проблема?

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

from multiprocessing import Queue, Process

class MyMegaException(Exception): pass

def deadlytask(queue):
queue.put(MyMegaException("Kranty 6"))

def main():
queue = Queue()
task = Process(target=deadlytask, args=(queue,))
task.start()
while task.is_alive():
data = queue.get()
raise data

if __name__ == '__main__':
main()



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version