Re[7]: Централизованная обработка исключений
От: D. Lex  
Дата: 04.10.04 14:55
Оценка:
Здравствуйте, Ivan, Вы писали:

I>Чтобы ловить необработанные исключения вовсе не обязательно ставить хук на системные функции. С технической точки зрения — да, Uhnandled Filter может быть только один, но на практике кроме CRT (при инициализации) никто больше не вызывает SetUnhExcFilter,


Здесь Вы категорически неправы. Как я хотел бы, чтобы так оно и было! Но увы, в винде UEF не переустанавливает разве что ленивый.

Возьмите, например, студию, создайте визардом гуевое приложение с несколькими окошками, менюшками, и т.п. На один пункт меню повесьте устанвку Вашего персонального UEF, а на кнопку, скажем — кидание исключения. Если Вы сможете добиться того, чтобы выполнить некоторую последовательность действий с этим приложением так, чтобы ваш UEF был вызван — считайте, что Вам очень сильно повезло. Потому что, к примеру, CreateWindow переустанавливает UEF несколько раз (не помню уже точно сколько, но намного больше одного), и нисколечки не собирается возвращать назад фильтр, стоявший до нее. Так что достаточно одного message box'а, чтобы Ваш фильтр пошел побоку.

I> Соответственно, если все фильтры необработанных исключений будут придерживаться такой тактики — запомнить адрес предыдущего и передать управление ему, если исключение не было обработано, — то необходимости использовать хук нет.


Ключевое слово "если". Увы, это давно уже не так.

I>имхо разумный компромисс:

I>- использовать SetUnhandledExceptionFilter, но не обрабатывать C++ исключений (чтобы не конфликтовать с CRT)
I>- для необработанных C++ исключений использовать в каждом потоке set_terminate (например, сделать dll и ловить события thread_attach и thread_detach). в обработчике terminate выполнять нужную обработку.

Кстати никто же не запрещает вызывать terminate() из Вашего обработчика.

I>Все это имеет отношение к W2K.

I>На Windows 2003 появились векторные обработчики исключений, благодаря которым можно было бы попробовать решить ту же проблему более изящно — не конфликтуя с CRT и не используя hook.

Но нам еще очень долго придется писать код, совместимый с w2k.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.