Что происходит, когда я выбрасываю исключение? - PullRequest
8 голосов
/ 18 июня 2010

У меня есть несколько технических вопросов. В этой функции:

string report() const {
    if(list.begin() == list.end()){
        throw "not good";
    }
    //do something
}

Если я сгенерирую исключение, что происходит с программой? Завершится ли моя функция или будет работать дальше? Если он завершится, какое значение он вернет?

Ответы [ 6 ]

13 голосов
/ 18 июня 2010

Если вы сгенерируете исключение, все функции будут возвращены обратно к точке, где он найдет блок try...catch с совпадающим типом catch.Если ваша функция не вызывается из блока try, программа завершит работу с необработанным исключением.

Проверьте https://isocpp.org/wiki/faq/exceptions для получения дополнительной информации.

6 голосов
/ 18 июня 2010

Он будет в основном идти вверх по стеку, пока не найдет обработчик исключений;если он достигнет конца стека, не найдя его, ваша программа потерпит крах.Если он действительно найдет его, он перемотает стек до этой точки, запустит обработчик и продолжит работу с кодом после блока обработчика, каким бы большим ни был ваш стек.Вы можете получить всевозможные подробности о механизме обработки исключений в C ++ через Google. Вот главный старт .

4 голосов
/ 18 июня 2010

Поскольку вы не перехватываете исключение в контексте функции, функция завершается, и стек будет разматываться при поиске обработчика исключения (блок catch, который будет соответствовать либо строке, либо универсальному catch ( ...)). Если он не найдет его, ваша программа прекратит работу.

3 голосов
/ 18 июня 2010

Ваша функция немедленно прекратит работу и ничего не вернет. Если нет операторов catch, перехватывающих исключение «вверх по цепочке вызовов», ваше приложение будет остановлено.

1 голос
/ 18 июня 2010

Это может быть хорошей отправной точкой для понимания исключений. Обработка исключений в C ++

1 голос
/ 18 июня 2010

Не вернется, фактически завершится и достигнет «ближайшего» (по стеку) блока try...catch.Если ничего не найдено, большую часть времени программа просто завершается, на некоторых платформах ошибка может быть напечатана, хотя я не знаю специфики этого (и, скорее всего, только те, которые получены из std :: exception).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...