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

有帮助吗?

解决方案

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

但是在最后一个项目中,我必须做的更简单,我最后为logic_error和runtime_error编写了几个System.Exception派生物。然后我会捕获这两个基类并使用typeid(错误)来编写抛出的.NET消息。这样我就不会“失去”从C ++中抛出的东西,除了最重要的东西之外,没有必要映射所有东西。

其他提示

一对一的映射对我来说似乎是最诚实的方法。 "通用"由于特定于应用程序的异常,几乎不可能进行映射,尽管STL异常类有一些明显的映射。

此外,还存在来自非托管代码的SEH异常问题。根据您的情况,可能需要捕捉并包裹它们。

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

你真的想做什么?

Interop已将本机异常转换为托管,包括SEH异常。但是,良好的设计要求 ALL 异常应该在本机API级别捕获。除非有充分的理由,否则你不应该偏离这一点。我们对你的设计知之甚少。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top