作为本锻炼的一部分,我熟悉了通过COM在非托管C ++中使用C#DLL的过程,我试图了解异常处理的工作原理。我写了一个很小的C#dll,它只包含一个引发异常的函数,以及一个C ++函数,该函数调用该函数并尝试捕获该异常。
以下是使用Visual Studio 2012用C#编写的DLL:
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.");
}
}
}
}
下面是尝试使用它的函数,该函数是使用Visual Studio 2008 C ++编写的:
void HandleException()
{
IExceptionThrowerPtr pThrower(__uuidof(ExceptionThrower));
try
{
pThrower->ThrowException();
AfxMessageBox(_T("No exception caught."));
}
catch (...)
{
AfxMessageBox(_T("I caught an exception!"));
}
}
当我调用此函数时,出现“未捕获异常”消息。
我希望客户端(C ++)端能够捕获_com_error对象并对其进行适当处理以了解发生了什么,但是似乎没有发现任何问题。为什么不?我在做错什么吗?
谢谢。
答案 0 :(得分:1)
您是否使用#import来生成_com_ptr
实现?
如果是这样,请小心忽略raw_interfaces_only指令,因为它会抑制错误处理包装函数的生成。
答案 1 :(得分:0)
您实际上并没有做错任何事情,但是理解有误。
C ++代码未捕获异常,因为C ++代码未引发任何异常。 .NET运行时中的CLR / interop层在将异常传递回之前会捕获该异常。所有好的COM代码都不会从COM方法或属性中引发异常,而会返回失败代码。
ThrowException()的返回码(HRESULT)是什么。应该不是S_OK,而是E_FAIL或其他描述性错误。