【问题标题】:Catching native C++ exceptions in C#在 C# 中捕获本机 C++ 异常
【发布时间】:2012-08-10 12:42:08
【问题描述】:

我有一些本地 C++ 类库,我用 C++ .NET 封装了它们,然后我从 C# 调用(三层!)。

我可以从 C++ .NET 中抛出异常并在 C# 中愉快地捕获它们。问题是我可以捕获我的本地 C++ 异常的唯一方法是捕获 System.Exception,这很好,但是在从 std::exception 到 System.Exception 的转换中,我丢失了关于错误的绝大多数信息(对于例如错误消息!)。我可以在 C++ .NET 层中捕获本机异常并作为 .NET 异常重新抛出,但这是一种侵入式解决方案,需要我在每个 C++ .NET 方法调用周围放置 try-catch 块(以捕获本机异常并重新抛出) .

是否有其他解决方案可以做到这一点,还是我只能自己动手......

【问题讨论】:

  • 我不认为有其他选择。所以要么接受它并查看调用堆栈,它给出了引发异常的本机代码中的行,或者使用包装器方法自定义异常(这对我来说更有意义:为什么 C# 必须了解 std::exception?)顺便说一句,您可能应该捕获 ExternalException 或 SEHException,而不是 Exception
  • 如何在 C# 中捕获异常?我抓不到他们。虽然我的 C++ DLL 是用 MinGW 创建的,但我不知道这会是什么问题。

标签: c# c++ .net exception


【解决方案1】:

您将不得不亲自动手,但您可以通过创建一个预处理器宏来封装所有重复的 catch 逻辑,从而大大减少工作量。

我假设您会想要捕获几种不同类型的异常,例如MFC CException、std::exception 以及 SEH 异常。

可能还想编写您的包装函数以返回 HRESULTS 并使用 SetErrorInfo(即转换为 COM 错误代码和错误信息) - 您可能会决定这会给出一个.Net 的更清洁接口,可以很好地将其转换为 .Net 异常。这将避免对 C++.Net 层的需求,并允许您使用 P/Invoke,并使其可从 VBA 调用。

或者您可能不会...只是指出选项!

【讨论】:

  • 或者如果你使用的是 c++11,你可以跳过宏并添加一个可以接受 lamdas 的包装函数
猜你喜欢
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多