Что именно вы имеете в виду под «глобальным обработчиком исключений»?
В 32-разрядной версии Windows Структурная обработка исключений (SEH) находит обработчик путем обхода цепочки обработчиков исключений потока, в котором исключениепроизошло.Цепочка обработчика исключений представляет собой связанный список записей, заголовок которых находится в FS:[0]
;записи обычно размещаются в стеке, помещаются в каждый try
и извлекаются при выходе из защищенного блока.Там есть процедура обратного вызова, на которую ссылается каждая запись исключения;Windows вызывает эту процедуру с деталями исключения во время фазы поиска, чтобы определить, собирается ли этот «уровень» цепочки «обрабатывать» исключение.Затем Windows раскручивает стек вызовов до этой точки, снова пройдя через цепочку исключений, вызывая каждый обратный вызов с другим значением, сообщая ему, что происходит раскручивание, пока не достигнет обработчика, который выбрал обработку исключения.Если обработчик не найден, процесс завершается, жестко, без уведомления.Обычно этого не происходит;ОС устанавливает собственный обработчик последнего шанса в нижней части стека (последний элемент в цепочке), и это обычно вызывает знакомое диалоговое окно «У этой программы возникла проблема».Но если что-то стало очень испорченным, или цепочка обработчика исключений была запутана, чтобы удалить его, то процесс идет тяжело.
Итак, из этого краткого обзора обработки исключений в Windows должно быть ясно, чтонет единого «глобального» обработчика, есть только список обработчиков, один список на поток (регистр FS
является частью контекста потока);и обработчик «последнего шанса» - тот, который установлен самым ранним в стеке.Самый простой способ перехвата исключения, возникающего внутри вашей DLL, - это немедленно установить обработчик исключения в каждой точке входа.См. Ответ Мейсона, чтобы узнать, как это сделать (это с try
/ except
);но имейте в виду, что если ваша DLL перезванивает куда-то еще (например, через процедуру обратного вызова), то вы можете ловить исключения, которые «не предназначены» для вас и не вызваны вашим кодом.(Неправильно ожидать, что исключения будут распространяться так же через сторонний код на уровне DLL, но это может произойти.)