C # против PowerShell.Как получить подробную информацию об исключении? - PullRequest
0 голосов
/ 26 декабря 2018

Я использую некоторую внешнюю библиотеку через интерфейс 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 содержит толькообщая информация, например:

Ошибка HRESULT E_FAIL была возвращена после вызова компонента COM.

при выполнении кода Samey в PowerShell приводит к более подробному описанию:

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

Ошибка при выполнении транзакции с информационной базой server_addr = nonexisthost descr = 11001 (0x00002AF9): Хост неизвестен.line = 1048 file = src \ DataExchangeCommon.cpp

Мой вопрос: что мне делать, чтобы получить ту же информацию об ошибке в C # (если это возможно)?

1 Ответ

0 голосов
/ 27 декабря 2018

Я не эксперт COM Interop, но я постараюсь ответить на все, что знаю, и надеюсь, что это поможет вам.

С управляемой стороны

Если HRESULT признансреда выполнения (CLR), среда выполнения автоматически создает конкретное управляемое исключение для ошибки (например, FileNotFoundException).В противном случае среда выполнения создает универсальный объект COMException, который говорит: «Я не знаю, что означает этот HRESULT».

Если неуправляемый код предоставляет информацию об ошибке, вы увидите это в свойстве ErrorCode, в противном случае вы будетеувидеть только код HRESULT.Вы можете попытаться найти этот код (google \ github), чтобы получить больше информации.

С неуправляемой стороны

Вам необходимо реализовать интерфейсы ISupportErrorInfo и IErrorInfo для предоставления дополнительной информации.

Итак, чтобы ответить на ваш вопрос , в C #,Вы не можете получить дополнительную информацию в объекте COMException, если эта информация не предоставлена.

Для получения дополнительной информации: COMException , Обработка исключений COM-взаимодействия , IErrorInfo , ISupportErrorInfo , Отображение HRESULT , Общие значения HRESULT

...