Нужно добавить (до цикла):
Код:

std::cin.exceptions(std::ios::badbit|std::ios::failbit);
По умолчанию все исключения отлавливаются, если они не разрешены. Это сделано для совместимости.
Предлагаю без исключений, в простых случаях это - лучший вариант
Код:

do {
...
} while(!(std::cin >> value));
Или по-современному:
Код:

struct subtask_t
{
int fold_exceptions;
int val;
subtask_t() :
fold_exceptions(std::cin.exceptions()),
val()
{
std::cin.exceptions(std::ios::badbit|std::ios::failbit);
}
~subtask_t()
{
std::cin.exceptions(fold_exceptions);
}
void operator()
{
for(;;)
{
try {
std::cin >> val;
return;
}
catch(std::ios::failure&)
{
}
}
}
}