Я никогда не пробовал использовать C++ исключения до нескольких дней назад, и я не уверен, что я делаю это правильно. Я пытаюсь выбросить исключение из конструктора, который не работает, например
X::X() {
/*...*/
if(error)
throw;
/*...*/
}
И используя его как:
try {
X a;
X b;
X c;
}
catch (...) {
// error handling
}
Отладчик (VS) говорит, что в броске было исключено исключение. Код после выполнения броска выполняется (я, хотя бросок работал как return), и блок catch не выполняется. Что мне здесь не хватает? Возможно, я немного упростил этот пост, но исходный код немного сложнее для публикации здесь.
Это потому, что вы не бросаете объект исключения. Вы должны использовать throw следующим образом:
throw std::runtime_error("Error message");
то вы сможете поймать его через
try {
...
} catch (const std::runtime_error& e) {
/* Handling */
}
Посмотрите на заголовок stdexcept
.
Вы должны throw
какое-то исключение (обычно это экземпляр какого-либо подкласса std :: exception), например
X::X() {
/*...*/
if(error)
throw std::runtime_error("my bad");
/*...*/
}
Более подробно см. Std :: runtime_error.
throw;
без каких-либо исключений, имеет смысл только внутри блока catch.
Я согласен с ответом Danvil: бросать исключение внутри конструктора - плохой вкус.