Когда вы генерируете исключение, функция останавливается там, и выполнение переходит к месту, где было поймано исключение. Ваша функция ничего не возвращает, потому что функция вообще не возвращает.
Вы можете просто сделать
if (avec.empty())
throw domain_error("Cannot operate on empty vector!");
И ваша функция там выйдет.
Обратите внимание, что вам не нужно беспокоиться о возвращаемом значении («Как функция может ничего не возвращать?» И т. Д.), Потому что вы не можете получить доступ к возвращаемому значению функции, которая сгенерировала (и не уловила) исключение, даже если вы пытаетесь.
Так, например, если вы сделаете
try {
std::vector<myStruct> vec;
std::vector<myStruct> retval = extract_notworking(vec);
print_vector(retval); // this line is only executed if extract_networking
// does not throw an exception
} catch (const domain_error& e) {
// we can't access retval here so no worries
}
Вы можете получить доступ к retval
, только если функция вернётся правильно (т.е. не выдает). В этом примере ваша функция будет выдавать, потому что vec
пусто, поэтому print_vector
никогда не будет вызываться.
Даже если вы сделаете это:
std::vector<myStruct> retval;
try {
std::vector<myStruct> vec;
retval = extract_notworking(vec);
print_vector(retval);
} catch (const domain_error& e) {
// we can access retval here but the assignment never happened
}
Поскольку функция не возвращала, присваивание ее возвращаемого значения retval
не произошло, и retval
по-прежнему является совершенно нормальной конструкцией по умолчанию vector
, которую вы можете свободно использовать. Таким образом, в этом примере retval
не назначено, а retval
не напечатано, потому что extract_networking
вызвало исключение, и выполнение перескочило в блок catch
, прежде чем эти две вещи могли произойти.