Попробую в кратце описать проблему:
В приложение было принято ловить глобально все исключения путем вызова AddVectoredExceptionHandler, колбэк которого проверяет код перехваченного исключения и если это, например, EXCEPTION_ARRAY_BOUNDS_EXCEEDED или EXCEPTION_ACCESS_VIOLATION или ... создает минидамп и завершает процесс.
Также приложение использует купленные ActiveX-ы. И вот, что просходит: Некоторые ActiveX-ы обрабатывают исключения, но при этом эти исключения все-равно ловятся нашим глобальным хендлером, и в этом случае процесс завершается, что быть не должно.(т.к ActiveX ожидает это исключение и обрабатывает его). Казалась бы, что проблемму можно решить путем регистрации этого ActiveX-а в неком списке. Теперь когда исключение ловится глобальным хендлером, то проверя модуль из которого это исключение пришло, и наличия его в списке, минидамп мы создавать не будем.
Однако появляется новая проблемма — как узнать это исключение ожидаеся ActiveX-ом и он его обрабатывает, или это пропущенное исключение, и нужно завершать процесс? Какие предложения?
Re: VEH
От:
Аноним
Дата:
20.05.09 10:30
Оценка:
use SetUnhandledExceptionFilter
Re[2]: VEH
От:
Аноним
Дата:
20.05.09 10:48
Оценка:
Здравствуйте, Аноним, Вы писали:
А>use SetUnhandledExceptionFilter
Не подходит, это то, что было у нас раньше
да, если в каждом потоке вставить такую обработку, то все работает как надо
Re[6]: VEH
От:
Аноним
Дата:
21.05.09 12:02
Оценка:
Здравствуйте, Андрей, Вы писали:
А>Здравствуйте, Андрей, Вы писали:
А>skip
А>да, если в каждом потоке вставить такую обработку, то все работает как надо
Либо в каждом потоке встраивать __try __except, что не допустимо в больших проектах, либо вешать глобально.
Вот так:
Здравствуйте, Аноним, Вы писали:
А>>>use SetUnhandledExceptionFilter А>>Не подходит, это то, что было у нас раньше А>Это единственный аргумент?
Не подходит потому, что где-то в коде могут давить исключения и тогда они не дойдут до нас . Мы же хотим контролировать этот процесс.
К примеру, Ваш модуль, подгружемый моим приложеннием, ловит и давит АV, который сам и породил. В случае VEH, я все-равно отловлю это исключение, и несмотря на то, что Вы, где-то его давите, я снему дамп и закрою приложение.
Были еще аргументы, но к сожалению, я не разберался с этим вопросом, и решение принемал не я.
Так, что нужно работать с тем, что есть.
К сожалению, AddVectoredExceptionHandler работает только начиная с WinXP
А у нас многие клиенты еще сидят на Win2K, поэтому приходится использовать __try / __except в каждом потоке
Зато нет проблем с тем, что ловятся лишние (не нам предназначенные) исключения
Если уж пришли в __except, значит, действительно дело плохо