2013-03-21 10 views
0

Я пытаюсь поймать исключение Interop в моем C кодКак перехватить исключение Interop?

IEngine engine = null; 

try 
{ 
    engine = engineLoader.GetEngineObject(AbbyySdkSerialNumber); 
} 
catch(System.Runtime.InteropServices.COMException ex) 
{ 
    int i = 0; 
} 

#, но он не хочет прыгать в поймать блок. Есть идеи? Заранее спасибо!

+0

Глупый вопрос, но вы ** получаете ** ошибку? – LiverpoolsNumber9

+0

Соответствует ли тип исключения? – asawyer

+1

Попробуйте поймать выполнение высокого уровня (объект Exception) – Jacek

ответ

3

Среда CLR автоматически отображает HRESULT из COM Interop более конкретные управляемые исключениями, не к COMException. Например, E_ACCESSDENIED становится UnauthorizedAccessException, E_OUTOFMEMORY становится OutOfMemoryException и так далее.

Если HRESULT является пользовательским результатом или если он неизвестен CLR, то среда выполнения передает общий код COMException. Свойство ErrorCode для COMException содержит значение HRESULT.

Полное обсуждение COM-взаимодействия см. Advanced COM Interoperability.

Обратите внимание, что если вы используете это под отладчиком VS, то по умолчанию выполнение прекратится в строке, вызвавшей исключение. Он не перейдет в блок catch, если вы не перейдете к следующей строке.

+0

Выше ссылка была устаревшей - здесь я нашел Advanced Com Interop: https://msdn.microsoft.com/en- us/library/bd9cdfyx (v = vs.100) .aspx – holtavolt

+0

@holtavolt: Большое спасибо - я исправил устаревшую ссылку. – RoadWarrior

1

Если это определенно выбрасывает исключение, я готов поспорить, что он не набрасывает тип ожидаемого исключения, то есть System.Runtime.InteropServices.COMException. Я бы предложил добавить пункт catch (Exception ex) в try, чтобы сначала проверить мое здравомыслие, а затем проверить исключение, которое - это.

0

У меня такое же исключение. Он говорит мне, что id проекта ошибочен - это должен быть серийный номер, который вы будете вставлять внутрь для объекта во время инициализации.

Совет: Проверьте это, если вы работаете в пробном режиме, а затем, если срок его действия истек.

Мое исключение произошло, когда я запускаю SDK через службу выигрыша. Служба запускается как локальная служба и не работает из-за недоступности для создания объекта объекта GetEngineObject. Я также попытался создать объект GetEngineObject с помощью другого имени пользователя (процесса), но это не помогло. Поэтому я рассматриваю разницу в имени пользователя, что создаю консольное приложение в своей визуальной студии, там я помещаю свой код в него и запускаю в режиме отладки в VS, это работает! (По сравнению с пробегами в моем имени пользователя)

Я не знаю, что это неправильно ...

0

Для моего случая, мне нужно поймать точный тип сгенерированного исключения. Создано исключение типа System.IO.IOException в управляемой части кода, а в моем неуправляемом коде мне нужно было сделать catch (IOException ^), что решило проблему. Или исключение никогда не было поймано даже с помощью catch (Исключение ^).

Смежные вопросы