В рамках этого упражнения по ознакомлению с использованием C # DLL в неуправляемом C ++ через COM я пытаюсь понять, как работает обработка исключений.Я написал крошечную C # dll, которая просто содержит функцию, которая выдает исключение, и функцию C ++, которая вызывает эту функцию и пытается перехватить исключение.
Вот библиотека DLL, написанная на C # с использованием Visual Studio 2012:
namespace ExceptionThrowingLib
{
public interface IExceptionThrower
{
void ThrowException();
}
public class ExceptionThrower : IExceptionThrower
{
public ExceptionThrower() { }
public void ThrowException()
{
using (StreamWriter writer = new StreamWriter("c:/misc/exceptionthrower.txt", true))
{
writer.WriteLine("Exception generation request received at " + DateTime.Now.ToString());
}
throw new Exception("This is a requested exception.");
using (StreamWriter writer = new StreamWriter("c:/misc/exceptionthrower.txt", true))
{
writer.WriteLine("This should never appear in the output file.");
}
}
}
}
А вот функция, которая пытается ее использовать, написанная на C ++ с использованием Visual Studio 2008:
void HandleException()
{
IExceptionThrowerPtr pThrower(__uuidof(ExceptionThrower));
try
{
pThrower->ThrowException();
AfxMessageBox(_T("No exception caught."));
}
catch (...)
{
AfxMessageBox(_T("I caught an exception!"));
}
}
Когда я вызываю эту функцию, появляется сообщение «Нет исключения поймано».
Я ожидал, что клиентская (C ++) сторона сможет перехватить объект _com_error и соответствующим образом обработать его, чтобы узнать, что произошло, но, похоже, ничего не перехватывается.Почему бы и нет?Я что-то не так делаю?
Спасибо.