我正在为HoloLens实现UWP应用程序,该应用程序通过MessageWebSocket
将点云流式传输到配套的PC。如果我在伴侣PC上的服务器尚未运行时在HoloLens上启动该应用程序,则调用ConnectAsync
的{{1}}方法会触发异常(因为它无法连接到服务器),这会导致我的应用崩溃了。但是,我不知道如何捕获此异常。
受official documentation of MessageWebSocket中所示示例代码的启发,这是一个重现问题的小样本:
MessageWebSocket
请注意,文档中的原始示例代码捕获了void TryConnectToWebsocket()
{
Windows::Networking::Sockets::MessageWebSocket^ websocket = ref new Windows::Networking::Sockets::MessageWebSocket();
websocket->Control->MessageType = Windows::Networking::Sockets::SocketMessageType::Utf8;
try
{
::OutputDebugString(L"Trying to connect...\n");
auto connectTask = Concurrency::create_task(websocket->ConnectAsync(ref new Windows::Foundation::Uri(L"ws://192.168.0.38:9090")));
connectTask.then([this, websocket]
{
::OutputDebugString(L"Connected successfully!");
websocket->Close(1000, "Application caused the connection to close.");
});
}
catch (...)
{
::OutputDebugString(L"Couldn't connect to websocket!");
}
}
类型的异常。我选择在此代码段中捕获所有类型的异常,以断言在它不是Platform::Exception
(或其子类型)的情况下,我不会错过该异常。
如果我运行此代码段(不启动服务器),则希望获得以下控制台输出:
Platform::Exception
但是,我得到的是以下内容(关于加载和卸载DLL的控制台输出已被忽略。一些描述问题的消息最初是德语,所以我已经翻译了它们。)
Trying to connect...
Couldn't connect to the websocket!
如您所见,catch块根本没有被执行。此外,非常短且不精确的堆栈跟踪使它看起来好像在后台线程中抛出了异常,而我什至没有机会捕获它。
我真的很想处理此异常,而不会使应用程序崩溃。有什么办法可以做到吗?
答案 0 :(得分:1)
从official sample开始,它并未将可能抛出的所有操作都放入try ... catch块中。相反,它在链的末尾添加了基于任务的延续,并在那里处理所有错误。您可以尝试以下代码来捕获异常。
create_task(messageWebSocket->ConnectAsync(ref new Windows::Foundation::Uri(L"ws://192.168.0.38:9090")))
.then([this](task<void> previousTask)
{
try
{
previousTask.get();
::OutputDebugString(L"Connected successfully!");
websocket->Close(1000, "Application caused the connection to close.");
}
catch (Exception^ ex)
{
::OutputDebugString(L"Couldn't connect to websocket!");
}
});