Когда create_task выдает исключение, я не могу поймать его в блоке try-catch - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь получить пользовательский URI канала PushNotification (платформа 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!
    }

ОБНОВЛЕНО:

Окружение:

  • Visual Studio 2017 (15.7.3)
  • Проект на основе cocos2d-x (3.16)
  • Project Targe Platform Version = 10.0.1493.0
  • Project Platform Toolset = Visual Studio 2015 (v140)

Вы можете клонировать проект cocos2dx и в коде вставки MainScene, который я показал ранее в методе onEnter (или где угодно).

Я получилситуация, когда у меня произошел сбой 100% для меня

  1. Удалить приложение, если оно было построено ранее;
  2. Отключиться отИнтернет;
  3. Создание приложения и запуск;
  4. Приложение попытается определить URI канала и произойдет сбой (но с сообщением об ошибке = WinRT information: The network is not present or not started).

Я понимаю, что бросать это исключение нормально.Но я все еще не могу понять, почему, когда я звоню t.get(), это не ловит исключение Platform::COMException^

...