我正在编写面向Windows 8.1的C ++ / CX WinRT库,我希望从C#app中使用它 如果我从异步方法中抛出异常,则C#app中显示的异常消息是错误的。
在WinRT库中,我有C ++ / CX代码,如:
IAsyncOperation<int>^ test()
{
return create_async([]() -> int
{
throw ref new Platform::Exception(E_POINTER, "My message.");
});
}
在C#app中我的代码如下:
try
{
await c.test();
}
catch (Exception ex)
{
Debug.WriteLine("Exception message: {0}", ex.Message);
}
调试模式下的输出是:
WinRT information: My message.
First-chance exception at 0x77692C1A in App1.exe: Microsoft C++ exception: Platform::Exception ^ at memory location 0x09A5E434. HRESULT:0x80004003 Invalid pointer
WinRT information: My message.
A first chance exception of type 'System.NullReferenceException' occurred in mscorlib.dll
Exception message: Object reference not set to an instance of an object.
我知道this problem。但是,这已针对Windows 8.1应用程序解决。我成功地从非异步方法传递了我的异常消息,但我不能让它适用于异步。任何人都可以帮我解决这个问题吗?
答案 0 :(得分:0)
如果它是异步的,则表示函数c.test()在另一个线程中执行,该线程只能捕获自己的异常形式,因此你的代码将无法正常工作。
使用异常,您可以使用返回代码。同样在这篇MSDN文章中:Best Practices in Asynchronous Programming,它首先讨论的是:避免Async Void。