C#DLL异常未在非托管C ++中捕获

时间:2019-05-03 20:21:37

标签: exception com

作为本锻炼的一部分,我熟悉了通过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对象并对其进行适当处理以了解发生了什么,但是似乎没有发现任何问题。为什么不?我在做错什么吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

您是否使用#import来生成_com_ptr实现?

如果是这样,请小心忽略raw_interfaces_only指令,因为它会抑制错误处理包装函数的生成。

答案 1 :(得分:0)

您实际上并没有做错任何事情,但是理解有误。

C ++代码未捕获异常,因为C ++代码未引发任何异常。 .NET运行时中的CLR / interop层在将异常传递回之前会捕获该异常。所有好的COM代码都不会从COM方法或属性中引发异常,而会返回失败代码。

ThrowException()的返回码(HRESULT)是什么。应该不是S_OK,而是E_FAIL或其他描述性错误。