Exceptions в потоке

Robin-Bobin
Дата: 27.12.2009 13:29:40
Здравствуйте.
Ситуация такая: у моей программы есть dll, который генерит какие-то данные и в разных потоках передает их основной программе.
Так вот, если в основной программе в обработчике этих данных происходит какой-нить эксепшен (например, деление на 0) и я его именно в этом потоке не обрабатываю try...catch..., то поток просто прекращает выполняться, не выдавая никаких ошибок (ни под отладчиком, ни в Release-экзешнике), а основная программа продолжает выполняться как ни в чем ни бывало.

Это плохо, ибо дальше программа может неправильно работать, но об этой ошибке никто ничего не узнает...

Если заключать код, выполняемый в потоке, в try...catch... - то исключение нормально обрабатывается в catch, но хотелось бы, чтобы кроме этого еще какое-то глобальное исключение было... которое сигнализировало о том, что появилось необработанное исключение...

ни AppDomain.CurrentDomain.UnhandledException ни Application.ThreadException (вставляю их перед вызовом Application.Run(new MainForm())) эти исключения не ловят...

Подскажите, как можно поймать эти исключения?

Заранее спасибо.
v skopin
Дата: 28.12.2009 13:09:02
Вообще-то у меня ответа нет, более того сам с чем-то подобным сталкиваюсь иногда.
Но тем не менее пара мыслей:
1. Чем плох "try...catch"?
2. Если у Вас потоки, то там есть пара свойств: алив, стайт.
3. Переписываете OnNotifyMessage: если да, то попытайтесь без неё, если нет, то можно здесь поиграть.
andrei.t
Дата: 28.12.2009 14:18:45
Какой FW? Если 1.1 или 1.0, то в них была такая особенность.
Если нет, то проверить во всех конфигах (machine, app) наличие строки

<legacyUnhandledExceptionPolicy enabled="1"/> и удалить при обнаружении.
Robin-Bobin
Дата: 28.12.2009 22:14:32
andrei.t
Какой FW? Если 1.1 или 1.0, то в них была такая особенность.
Если нет, то проверить во всех конфигах (machine, app) наличие строки

<legacyUnhandledExceptionPolicy enabled="1"/> и удалить при обнаружении.


FW 3.5, ...Такой строки в конфигах нет
Robin-Bobin
Дата: 28.12.2009 22:20:14
v skopin
Вообще-то у меня ответа нет, более того сам с чем-то подобным сталкиваюсь иногда.
Но тем не менее пара мыслей:
1. Чем плох "try...catch"?
2. Если у Вас потоки, то там есть пара свойств: алив, стайт.
3. Переписываете OnNotifyMessage: если да, то попытайтесь без неё, если нет, то можно здесь поиграть.


1. Всем хорош, но если его по какой-то причине нет (а полностью исключать такую вероятность нельзя), то хотелось бы получать стандартный эксепшен и поставить try...catch... или же как-то по-другому отреагировать на него, а не пропустить возможно серьезный баг;
2. Как помогут эти свойства?
3. Честно говоря не понял... можно поподробнее?

Более подробно про ситуацию: потоков входящих в основной модуль могут быть десятки или сотни. И точки входа у них разные...
v skopin
Дата: 29.12.2009 01:35:24
Robin-Bobin,

>Как помогут эти свойства?
отловить на что они меняются при исключении и ...
(хотя это типа п.1)

>Честно говоря не понял... можно поподробнее?
всё на уровне предположений:
любое исключение генерирует сообщение
вот и ловите это сообщение;

НО
у меня ваша ситуация возникала, когда я делал свой контрол и в нём
        protected override void OnNotifyMessage(Message m)
        {
            if (m.Msg != 0x14)
                base.OnNotifyMessage(m);
        }
самое смешное, что и, когда исключение было в совсем другом месте, не относящемся к этому контролу, всё как у вас: что-то обрывалось и ничего!
andrei.t
Дата: 29.12.2009 09:45:29
Robin-Bobin
andrei.t
Какой FW? Если 1.1 или 1.0, то в них была такая особенность.
Если нет, то проверить во всех конфигах (machine, app) наличие строки

<legacyUnhandledExceptionPolicy enabled="1"/> и удалить при обнаружении.


FW 3.5, ...Такой строки в конфигах нет


И при этом исключение из другого потока не пробрасывается в основной? Можно пример когда, как запускается задача в отдельном потоке из сторонней библиотеки и как там реализована обработка исключений?
D129
Дата: 29.12.2009 10:05:11
andrei.t

И при этом исключение из другого потока не пробрасывается в основной?

А в чем проблема перебросить? Делегат, генерирующий ваше исключение, инвок - и все дела.
andrei.t
Дата: 29.12.2009 11:51:40
D129
andrei.t

И при этом исключение из другого потока не пробрасывается в основной?

А в чем проблема перебросить? Делегат, генерирующий ваше исключение, инвок - и все дела.


Проблема не в реализации. Хоть pipe слушать. У автора, с его слов, на 3.5 ситуация, которая была только в 1.1 и давно изменена.

http://msdn.microsoft.com/en-us/library/ms228965.aspx
Robin-Bobin
Дата: 05.01.2010 01:08:24
andrei.t
Robin-Bobin
andrei.t
Какой FW? Если 1.1 или 1.0, то в них была такая особенность.
Если нет, то проверить во всех конфигах (machine, app) наличие строки

<legacyUnhandledExceptionPolicy enabled="1"/> и удалить при обнаружении.


FW 3.5, ...Такой строки в конфигах нет


И при этом исключение из другого потока не пробрасывается в основной? Можно пример когда, как запускается задача в отдельном потоке из сторонней библиотеки и как там реализована обработка исключений?



Эм... ваша правда... проблема в DLL...
Данные из DLL в новом потоке передавались в основную программу через событие.
Генерация события была в try, но catch был пустым :(
Добавил в catch обработчик - этот обработчик выполняется.

НО убираю try....catch - и необработанный exception выдается в коде DLL - там, где вызывается событие... а не там, где произошла действительно ошибка (в коде основной программы, подписанном на это событие, производится деление на 0).

С чем это может быть связано?

P.S. Никаких глобальных перехватчиков ошибок в DLL нет.