Насколько я понимаю, когда асинхронная операция выдает исключение, она будет передана обратно в поток, который вызывает std::future::get()
, Тем не менее, когда такой поток вызывает std::future::wait()
исключение распространяется не сразу — оно будет выдано при последующем вызове std::future::get()
,
Тем не менее, в таком сценарии, что должно случиться с таким исключением, если будущий объект выходит из области видимости после вызова std::future::wait()
, но до звонка std::future::get()
?
Для тех, кто заинтересован, вот простой пример. В этом случае исключение автоматически обрабатывается потоком / будущим пакетом:
#include "stdafx.h"#include <thread>
#include <future>
#include <iostream>
int32_t DoWork( int32_t i )
{
std::cout << "i == " << i << std::endl;
throw std::runtime_error( "DoWork test exception" );
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
auto f = std::async( DoWork, 5 );
try
{
//f.get(); // 1 - Exception does propagate.
f.wait(); // 2 - Exception does NOT propagate.
}
catch( std::exception& e )
{
std::cout << e.what() << std::endl;
return -1;
}
return 0;
}
Это игнорируется и отбрасывается, как если бы вы wait()
за ценность, но никогда get()
Это.
wait()
просто говорит: «блокируй, пока будущее не будет готово», будь то готово со значением или исключением. Это до вызывающего на самом деле get()
значение (или исключение). Обычно вы просто используете get()
, который все равно ждет.
vs2012 \ VC11 \ элт \ future.cpp
есть ошибка с
static const char *const _Future_messages[] =
{ // messages for future errors
"broken promise",
"future already retrieved",
"promise already satisfied",
"no state"};
этот код сгенерировал недопустимое согласие с «_Future_messages», потому что
_Mycode.value () возвращает 4.
const char *__CLR_OR_THIS_CALL what() const _THROW0()
{ // get message string
return (_Get_future_error_what(_Mycode.value()));
}
// пример кода
std::future<int> empty;
try {
int n = empty.get();
} catch (const std::future_error& e) {
const error_code eCode = e.code();
char *sValue = (char*)e.what();
std::cout << "Caught a future_error with code " << eCode.message()
<< " - what" << sValue << endl;
}