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

.net 翻译C+中异常的最佳实践+/CLI包装类,.net,exception,error-handling,c++-cli,.net,Exception,Error Handling,C++ Cli,我正在为抛出异常的现有本机类编写.NET包装器类。在本地C++异常和托管异常之间进行翻译的最佳做法是什么?捕获并以一对一的方式重新抛出(例如std::invalid_argument->System.System.ArgumentException)?是否已经在某处绘制了地图?据我所知,没有标准地图。我过去所做的是翻译我所知道的,以及System.Runtime.InteropServices.SEHException的catch块。所有未转换的异常都将转换为该异常。只要您有一个抛出异常的代码的

我正在为抛出异常的现有本机类编写.NET包装器类。在本地C++异常和托管异常之间进行翻译的最佳做法是什么?捕获并以一对一的方式重新抛出(例如std::invalid_argument->System.System.ArgumentException)?是否已经在某处绘制了地图?

据我所知,没有标准地图。我过去所做的是翻译我所知道的,以及System.Runtime.InteropServices.SEHException的catch块。所有未转换的异常都将转换为该异常。只要您有一个抛出异常的代码的调试版本,您就会得到一个很好的堆栈跟踪。然后,您可以查看异常并编写包装器


但在上一个项目中,我做了一件简单得多的事情,最后我写了两个System.Exception派生的逻辑错误和运行时错误。然后我将捕获这两个基类,并使用typeid(err)编写抛出的.NET消息。这样,我就不会“失去”从C++中被扔掉的东西,但不需要把所有的东西都映射出来,除了最重要的。由于特定于应用程序的异常,很难实现“通用”映射,尽管STL异常类有一些明显的映射


此外,还存在非托管代码的SEH异常问题。根据您的情况,可能也需要捕获和包装它们。

我认为这取决于包装器的设计。如果管理器包装器的接口与非托管库的接口几乎相同,则将异常重新显示为1:1。如果要显著更改接口,则抛出最适合新接口的异常。无论哪种方式,确保包装器在操作无法完成时抛出异常,以符合.NET设计准则。

您真正想做的是什么

Interop已经将本机异常转换为托管异常,包括SEH异常。然而,好的设计要求所有异常都应该在本机API级别捕获。除非有充分的理由,否则你不应该偏离这一点。我们对你们的设计了解不够