Я пытаюсь получить пользовательский 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% для меня
- Удалить приложение, если оно было построено ранее;
- Отключиться отИнтернет;
- Создание приложения и запуск;
- Приложение попытается определить URI канала и произойдет сбой (но с сообщением об ошибке =
WinRT information: The network is not present or not started
).
Я понимаю, что бросать это исключение нормально.Но я все еще не могу понять, почему, когда я звоню t.get()
, это не ловит исключение Platform::COMException^