Manipulação de exceção, tarefas assíncronas de simultaneidade do WinRT C ++

Eu tenho que implementar um HTTP GET assíncrono em C ++ e nós temos que ser capaz de enviar o aplicativo para o Windows 8 Store.

Meu problema é o seguinte:

Eu encontrei um código de exemplo adequado que implementa uma classe HttpRequesthttp://code.msdn.microsoft.com/windowsapps/HttpClient-sample-55700664

Este exemplo funciona se o URI estiver correto, mas gera uma exceção se o URI apontar para um local inválido / não existente (como: www.google22.com). Isso seria bom se eu pudesse pegar a exceção, mas não consigo descobrir como ou onde devo pegá-lo.

Agora algum código. Esta é a chamada para o método baseado em async, concurrency :: task que lança a exceção:

try {
...
Web::HttpRequest httpRequest;
    httpRequest.GetAsync(uri, cancellationTokenSource.get_token())
        .then( []  (concurrency::task<std::wstring> response)
    {
        try {
            response.get();
        }
        catch( ... ) {
            int i = 1;
        }
        return response;
    })
...
} catch ( ... ) {
...
}

E este é o segmento relevante do método GetAsync (o final do método):

// Return a task that completes when the HTTP operation completes. 
// We pass the callback to the continuation because the lifetime of the 
// callback must exceed the operation to ensure that cancellation 
// works correctly.
return completionTask.then([this, stringCallback](tuple<HRESULT, wstring> resultTuple)
{
    // If the GET operation failed, throw an Exception.
    CheckHResult(std::get<0>(resultTuple));

    statusCode = stringCallback->GetStatusCode();
    reasonPhrase = stringCallback->GetReasonPhrase();

    return std::get<1>(resultTuple);
});

A linha CheckHResult lança a exceção, é o código:

inline void CheckHResult(HRESULT hResult)
{
if (hResult == E_ABORT)
{
    concurrency::cancel_current_task();
}
else if (FAILED(hResult))
{
    throw Platform::Exception::CreateException(hResult);
}
}

Eu tenho um try-catch em torno da chamada GetAsync e também tenho um try-catch no lambda de continuação.

Na documentação relevante da Microsoft (http://msdn.microsoft.com/pt-br/library/windows/apps/hh780559.aspx ) afirma que exceções lançadas por uma tarefa devem ser acessadas na próxima tarefa da cadeia, mas de alguma forma isso não funciona no meu caso. Além disso, nem mesmo o try-catch em torno de toda a chamada pega a exceção, ela simplesmente passa por tudo ...

Alguém teve esse problema? Acho que já tentei tudo o que é declarado nas documentações oficiais, mas ainda assim a exceção fica instável e falha o aplicativo. O que eu sinto falta?

EDITAR:

Eu modifiquei o código para fazer nada além de manipulação de exceção e ele ainda não captura a exceção gerada pela tarefa em .GetAsync

Código limpo:

try
{
  Windows::Foundation::Uri^ uri;
  uri = ref new Windows::Foundation::Uri( uri_string_to_fetch );

  concurrency::cancellation_token_source cancellationTokenSource = concurrency::cancellation_token_source();

  Web::HttpRequest httpRequest;
  OutputDebugString( L"Start to fetch the uri...\n" );
  httpRequest.GetAsync(uri, cancellationTokenSource.get_token())
    .then([](concurrency::task<std::wstring> response)
  {
    try {
      response.get();
    }
    catch( ... ) {
      OutputDebugString(L"unknown Exception");
    }
  })
  .then([](concurrency::task<void> t)
  {
    try {
      t.get();
      // .get() didn't throw, so we succeeded.
    }
    catch (Platform::Exception^ e) {
      // handle error
      OutputDebugString(L"Platform::Exception");
    }
    catch (...) {
      OutputDebugString(L"unknown Exception");
    }
  });
} 
catch (Platform::Exception^ ex) {
  OutputDebugString(L"Platform::Exception");
  errorCallback(-1);
} 
catch ( ... ) {
  OutputDebugString(L"unknown Exception");
  errorCallback(-2);
}

Isso ainda me dá uma falha com a mensagem de exceção:Exceção de primeira chance em 0x75644B32 em App1.exe: Microsoft C ++ exceção: Platform :: COMException ^ no local da memória 0x077EEC28. HRESULT: 0x800C0005

Além disso, quando coloco alguns pontos de interrupção no código, ele mostra que a exceção passa por tudo antes do primeiro. Eu coloquei pontos de interrupção nesses locais (no código simplificado / limpo):

antes da chamada GetAsyncno GetAsync, para oCheckHResult (std :: get <0> (resultTuple)); linha que lança a exceçãoem cada tentativa e caso de captura / bloco

Ordem de execução, testada com breakpoints:

antes da chamada GetAsync [OK]no GetAsync, a linha que lançará a exceção [OK]agora o aplicativo trava, passa por todos os try-catch, continuaragora a linha no primeiro.então é chamado, no bloco tryoutras exceções no nível do aplicativo não são capturadas por nenhum bloco catchagora o primeiro.entãobloco de capturasegundo.experimentar quadrae nada mais, o segundo.entãoA pegada não captura nenhuma exceção

E os logs de depuração impressos, em ordem: - Comece a buscar o uri ... - Exceção de primeira chance em 0x75644B32 em App1.exe: Microsoft C ++ exceção: Platform :: COMException ^ no local da memória 0x082FEEF0. HRESULT: 0x800C0005 - exceção de primeira chance em 0x75644B32 em App1.exe: exceção de Microsoft C ++: [rethrow] no local de memória 0x00000000. - Exceção de primeira chance em 0x75644B32 em App1.exe: Microsoft C ++ exceção: Platform :: COMException ^ no local da memória 0x082FE670. HRESULT: 0x800C0005 - exceção de primeira chance em 0x75644B32 em App1.exe: Microsoft C ++ exceção: Platform :: COMException ^ no local da memória 0x082FDD88. HRESULT: 0x800C0005 - exceção desconhecida

O que está acontecendo??

questionAnswers(2)

yourAnswerToTheQuestion