Нет счастливых ответов здесь. Недопустимо, чтобы исключение C ++ или SEH завершало метод COM. Вы должны поймать их и перевести на соответствующий HRESULT. Ваш Coclass должен реализовать интерфейсы ISupportsErrorInfo и IErrorInfo, чтобы клиент мог получить информацию об исключении обратно. CLR с готовностью сделает это для создания настроенного сообщения об исключении.
Метод Error (), о котором вы говорите, - это, скорее всего, метод ATL CComCoClass :: Error () . Он устанавливает информацию об исключении, которую возвращает IErrorInfo.
Нет механизма для внедрения одного блока try / catch для перехвата всех возможных исключений, COM-методы вызываются непосредственно из клиента. Вы должны сделать это для каждого отдельного COM-метода, который вызывает код C ++, который может вызвать исключение. Неприятно, но это должно было быть сделано, когда код был написан. Вам, вероятно, нужно обернуть каждый из них, поскольку выяснить, вызывает ли он код, который может выдать, сейчас сложно.
Технически, вы можете изменить фабрику классов, чтобы создать оболочку, которая реализует каждый метод интерфейса и делегирует его фактическому методу. С шаблоном попробуйте / поймать обработчики. Очень механический, вы можете придумать несколько макросов, чтобы уменьшить удар.