在C ++ / CLI包装器类中转换异常的最佳实践

时间:2008-09-22 22:11:30

标签: .net exception error-handling c++-cli

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

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

你真的想做什么?

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