我正在通过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#中获得相同的错误信息(如果可能)?
答案 0 :(得分:1)
我不是COM Interop专家,但我会尽力回答我所知道的,希望对您有所帮助。
如果运行时(CLR)识别HRESULT,则运行时将自动为该错误创建特定的托管异常(例如FileNotFoundException)。否则,运行时将创建一个通用的COMException对象,该对象显示“我不知道此HRESULT的含义”。
如果非托管代码提供了错误信息,则将在ErrorCode属性中看到它,否则,您将仅看到HRESULT代码。 您可以尝试搜索此代码(google \ github)以获取更多信息。
您需要实现ISupportErrorInfo和IErrorInfo接口以提供更多信息。
因此要回答您的问题,在C#中,如果未提供此信息,则无法在COMException对象中获取更多信息。
有关更多信息: COMException,Handling COM Interop Exceptions,IErrorInfo,ISupportErrorInfo,HRESULT's mapping,Common HRESULT values