如何识别COMException的原始异常

时间:2017-05-19 13:36:08

标签: c# delphi exception com interop

我们有一个C#编写的Web应用程序,它通过COM与Delphi编写的应用程序进行通信。 C#应用程序调用Delphi应用程序的方法来获取所需的数据。当Delphi应用程序出现任何问题时,我们的C#-Code会抛出{ "services": [{ "id": "b2", "address": { "location_id": "loc_b2", "name": "kelaniya-1", "lon":"" , "lat":"" }, "size": [2889] },{ "id": "b1", "address": { "location_id": "loc_b1", "name": "hunupitiya-2", "lon": "", "lat": "" }, "size": [1700] }] }

以下是COMException

的详细信息

enter image description here

问题:我们希望根据Delphi-Exception的类型处理这些异常。但我们不能,因为它每次都是一个COMException。

问题:如何在C#-Code中识别或映射原始类型的Delphi异常?

1 个答案:

答案 0 :(得分:0)

您应该使用Marshal.ThrowExceptionForHR方法来实现此目标。 如果需要,可以通过自定义HR代码结果来增强它。

以下是示例代码:

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

        Marshal.ThrowExceptionForHR(exception.HResult);
    }

MissingFolderException当然是在您的代码中实现的特定异常。

此处提供了更多详细信息:How to: Map HRESULTs and Exceptions

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