Как я должен использовать исключения конструктора C ++?

0

Я никогда не пробовал использовать C++ исключения до нескольких дней назад, и я не уверен, что я делаю это правильно. Я пытаюсь выбросить исключение из конструктора, который не работает, например

X::X() {
    /*...*/
    if(error)
        throw;
    /*...*/
}

И используя его как:

try {
    X a;
    X b;
    X c;
}
catch (...) {
    // error handling
}

Отладчик (VS) говорит, что в броске было исключено исключение. Код после выполнения броска выполняется (я, хотя бросок работал как return), и блок catch не выполняется. Что мне здесь не хватает? Возможно, я немного упростил этот пост, но исходный код немного сложнее для публикации здесь.

  • 1
    Не могли бы вы опубликовать SSCCE ?
Теги:
exception
constructor

2 ответа

2

Это потому, что вы не бросаете объект исключения. Вы должны использовать throw следующим образом:

throw std::runtime_error("Error message");

то вы сможете поймать его через

try {
    ...
} catch (const std::runtime_error& e) {
    /* Handling */
}

Посмотрите на заголовок stdexcept.

  • 0
    Это было бы более понятно, если бы вместо того, чтобы говорить о «типе исключения», оно ссылалось на «объект исключения» или просто «что-то». Текущая работа предполагает, что вам нужно бросить что-то особого типа, но вы можете бросить почти все (если это что-то ).
  • 0
    Я изменил это, должен смотреть мой язык больше, спасибо.
1

Вы должны throw какое-то исключение (обычно это экземпляр какого-либо подкласса std :: exception), например

X::X() {
   /*...*/
   if(error)
       throw std::runtime_error("my bad");
   /*...*/
}

Более подробно см. Std :: runtime_error.

throw; без каких-либо исключений, имеет смысл только внутри блока catch.

Я согласен с ответом Danvil: бросать исключение внутри конструктора - плохой вкус.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню