Здесь есть несколько вариантов.Наше общее руководство по API для API среды выполнения Windows, которые имеют четко определенные ожидаемые режимы сбоев, заключается в том, что информация об ошибках должна быть частью обычных параметров и возвращаемого значения.В этой ситуации мы обычно создаем API TryDoSomething и предоставляем расширенную информацию об ошибках с помощью параметра return или out.Это работает лучше всего для нас, потому что нет единого способа сопоставления исключений для всех языков.Это тема, которую мы надеемся еще раз обсудить в xlang в будущем.
HRESULT можно использовать с оговоркой.Значения HRESULT могут создавать неудобства во всем, кроме C ++, где вам нужно переопределить их локально, потому что вы не можете просто использовать заголовок.Они будут генерировать исключения в большинстве языков, поэтому, если это распространено, вы будете создавать шум отладчика для клиентов ваших компонентов.
Последняя опция позволяет вам передавать исключение для конкретного языка, хранящееся в COM-объекте.через границу ABI (и до логического стека COM, в том числе через маршаллированные вызовы).На практике он будет использоваться только кодом C ++, скомпилированным с тем же компилятором, настройками и определениями типов, что и сам компонент.Например, передача его из компонента, скомпилированного с помощью VC, в компонент, скомпилированный с помощью Clang, может привести к повреждению памяти.
Предполагая, что я вас не напугал, вы захотите взглянуть на RoOriginateLanguageException .Это позволяет вам обернуть исключение в COM-объект и сохранить его вместе с другими данными об ошибках winrt в TLS.Мы используем это в проекциях, чтобы позволить исключениям, генерируемым в обратном вызове, распространяться на внешний код, используя ту же проекцию контролируемым образом, который безопасно перематывается через другой код, потенциально написанный с использованием других языков или инструментов.Вот как реализована поддержка в C # и других языках.
Спасибо,
Бен