代码之家  ›  专栏  ›  技术社区  ›  Brian Stewart

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

  •  4
  • Brian Stewart  · 技术社区  · 16 年前

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

    4 回复  |  直到 10 年前
        1
  •  4
  •   Justin Rudd    16 年前

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

        2
  •  2
  •   Constantin    16 年前

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

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

        3
  •  2
  •   C. Dragon 76    16 年前

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

        4
  •  1
  •   user6105 user6105    16 年前

    Interop已经将本机异常转换为托管异常,包括SEH异常。然而,好的设计规定了这一点 全部的