C# 如何识别COMException的原始异常
我们有一个C#编写的Web应用程序,它通过COM与Delphi编写的应用程序进行通信。C#应用程序调用Delphi应用程序的方法来获取所需的数据。当Delphi应用程序中出现任何错误时,C代码中将抛出一个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方法来实现
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或其他错误值。只需选择最合适的现有版本,或定义自己的版本。如果需要,还可以公开一个函数,该函数将消息返回到某个错误号。