在 C++/CLI 包装类中翻译异常的最佳实践

Bri*_*art 5 .net error-handling c++-cli exception

我正在为抛出异常的现有本机类编写一个 .NET 包装类。在本机 C++ 异常和托管异常之间进行转换的最佳实践是什么?一对一地捕获并重新抛出(例如 std::invalid_argument -> System.System.ArgumentException)?是否已经在某处绘制了映射?

Jus*_*udd 5

据我所知,没有标准映射。我过去所做的就是翻译我所知道的内容,以及 System.Runtime.InteropServices.SEHException 的 catch 块。所有未翻译的异常都将转换为该异常。只要您有抛出异常的代码的调试版本,您就应该获得不错的堆栈跟踪。然后你可以去查看异常并编写包装器。

但在我必须执行此操作的上一个项目中,我采用了更简单的方法,最终为逻辑错误和运行时错误编写了几个 System.Exception 派生类。然后我会捕获这 2 个基类并使用 typeid(err) 写入抛出的 .NET 消息。这样我就不会“丢失”C++ 抛出的内容,但也不必映射除最重要的之外的所有内容。