0

我尝试接收用户的 PushNotification Channel URI(Windows 10 平台)并为某些用户应用程序生成异常This operation returned because the timeout

要处理任务链中的错误,我应该在链的末尾添加一个基于任务的延续并处理那里的所有错误(如此处所述https://docs.microsoft.com/en-us/windows/uwp/threading- async/asynchronous-programming-in-cpp-universal-windows-platform-apps#handling-errors-in-a-task-chain)。

所以我就这么做了。但是在我调用t.get();系统生成Platform::COMException^异常后,它不会在 try-catch 块中捕获。为什么?

有代码:

{
    create_task(PushNotificationChannelManager::CreatePushNotificationChannelForApplicationAsync())
    .then([this](PushNotificationChannel^ pnChannel)
    {
        // ..
        // DONE: pnChannel->Uri
        // ..
    }, task_continuation_context::get_current_winrt_context())
    .then([](task<void> t)
    {
        try
        {
            t.get(); // <<<< After exec this line app crash!
        }
        catch (Platform::COMException^ e)
        {
            OutputDebugString(L"Exception catches!");
        }
    });
}

有完整的异常消息:

Exception thrown at 0x00007FFD9D74A388 in GameName.exe: Microsoft C++
exception: Platform::COMException ^ at memory location 0x000000249A9FEB60. 
HRESULT:0x800705B4 This operation returned because the timeout period expired.
WinRT information: This operation returned because the timeout

Visual Studio 将我扔到c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\exception要阻止的文件中:

[[noreturn]] void _RethrowException() const
    {
    __ExceptionPtrRethrow(this); // <<<< here everything stoped!
    }

更新:

环境:

  • 视觉工作室 2017 (15.7.3)
  • 基于cocos2d-x(3.16)的项目
  • 项目目标平台版本 = 10.0.1493.0
  • 项目平台工具集 = Visual Studio 2015 (v140)

您可以克隆 cocos2dx 项目并在 MainScene 中粘贴我之前在 onEnter 方法(或任何地方)中显示的代码。

我遇到了一种情况,我 100% 崩溃了

  1. 卸载之前构建的应用程序;
  2. 断开互联网连接;
  3. 构建应用程序并启动;
  4. 该应用程序将尝试检测 Channel URI & 将崩溃(但崩溃消息 = WinRT information: The network is not present or not started)。

我知道抛出该异常是正常的。但我仍然无法理解为什么当我调用t.get()它时不会捕获异常Platform::COMException^

4

0 回答 0