C# 如何识别COMException的原始异常

C# 如何识别COMException的原始异常,c#,delphi,exception,com,interop,C#,Delphi,Exception,Com,Interop,我们有一个C#编写的Web应用程序,它通过COM与Delphi编写的应用程序进行通信。C#应用程序调用Delphi应用程序的方法来获取所需的数据。当Delphi应用程序中出现任何错误时,C代码中将抛出一个COMException 以下是COMException的详细信息: 问题:我们希望根据Delphi异常的类型来处理这些异常。但我们不能,因为每次都是例外 问题:我们如何在C代码中识别或映射Delphi异常的原始类型?您应该使用Marshal.throweExceptionForHR方法来实现

我们有一个C#编写的Web应用程序,它通过COM与Delphi编写的应用程序进行通信。C#应用程序调用Delphi应用程序的方法来获取所需的数据。当Delphi应用程序中出现任何错误时,C代码中将抛出一个
COMException

以下是
COMException
的详细信息:

问题:我们希望根据Delphi异常的类型来处理这些异常。但我们不能,因为每次都是例外


问题:我们如何在C代码中识别或映射Delphi异常的原始类型?

您应该使用Marshal.throweExceptionForHR方法来实现此目标。 如果需要,可以通过自定义人力资源代码和结果进行增强

以下是示例代码:

    try
    {
        ...
    }
    catch (COMException exception)
    {
        switch (exception.HResult)
        {
            case -2147418113:
                throw new MissingFolderException("Custom exception");
        }

        Marshal.ThrowExceptionForHR(exception.HResult);
    }
MissingFolderException当然是代码中实现的特定异常

更多详情如下:


可能发生的Delphi代码在某些情况下不会返回不同的异常(两个不同的异常的HResult相同),但必须修改Delphi代码。

更好的设计是将原始异常作为强异常返回并在Delphi中处理,您是否能够编辑Delphi代码?我们不希望在Delphi中处理它。我们想在C端处理它。@Jeremythonpson是对的。不要让异常从应用程序或DLL转义到用不同语言编写的可执行文件中。显然,C#可以以某种方式处理Delphi异常,但显然原始数据(主要)丢失了。不要那样做。如果可以,在Delphi中处理异常,并以其他方式传递有关异常类型和消息的信息。@Rudy Velthiuis:非常感谢您的回答。关于“以其他方式传递有关异常类型和消息的信息”:传递信息的常用方式是什么?大多数API中使用的常用方式类似于HRESULT或其他错误值。只需选择最合适的现有版本,或定义自己的版本。如果需要,还可以公开一个函数,该函数将消息返回到某个错误号。