C#与PowerShell。如何获取详细的异常信息?

时间:2018-12-26 16:51:24

标签: c# powershell exception-handling comexception

我正在通过COM接口使用一些外部库。 我有通用类。

Database.Connector connector = new Database.Connector();
string connectString = "srvr=nonexisthost;database=test;"; // bogus connect string
try
{
    var database = connector.Connect(connectString);
}
catch (COMException ex)
{
    Console.WriteLine(ex.Message);
}

试图建立一个防错逻辑,我故意引起了异常。

我发现C#COMException仅包含通用信息,例如:

  

对COM组件的调用已返回错误HRESULT E_FAIL。

在PowerShell中执行Samey代码时会得到更详细的描述:

$connector = New-Object -ComObject Database.Connector
$connectString = "srvr=nonexisthost;database=test;"
$database = $connector.Connect($connectString)
  

使用信息库执行事务时出错   server_addr =不存在主机descr = 11001(0x00002AF9):主机未知。   line = 1048 file = src \ DataExchangeCommon.cpp

我的问题是:我应该怎么做才能在C#中获得相同的错误信息(如果可能)?

1 个答案:

答案 0 :(得分:1)

我不是COM Interop专家,但我会尽力回答我所知道的,希望对您有所帮助。

从被管理方

如果运行时(CLR)识别HRESULT,则运行时将自动为该错误创建特定的托管异常(例如FileNotFoundException)。否则,运行时将创建一个通用的COMException对象,该对象显示“我不知道此HRESULT的含义”。

如果非托管代码提供了错误信息,则将在ErrorCode属性中看到它,否则,您将仅看到HRESULT代码。 您可以尝试搜索此代码(google \ github)以获取更多信息。

从不受管的角度来看

您需要实现ISupportErrorInfo和IErrorInfo接口以提供更多信息。

因此要回答您的问题,在C#中,如果未提供此信息,则无法在COMException对象中获取更多信息。

有关更多信息: COMExceptionHandling COM Interop ExceptionsIErrorInfoISupportErrorInfoHRESULT's mappingCommon HRESULT values